マイクロマウス研修(kora編)[23] STM32マイコンでシリアル通信


こんにちは。koraです。

今回はシリアル通信を使ってマイコンからPCにデータを送れるようにしたいと思います。

HALを使ったシリアル通信

HAL_UART_Transmit()関数を使用します。第一引数がUARTハンドル、第二引数が送信データバッファへのポインタ、第三引数が送信するデータのバイト数、第四引数がタイムアウトの時間です。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    uint8_t msg[] = "hello world!\r\n";
    HAL_UART_Transmit(&huart1, msg, strlen((char*)msg), 100);
  }
  /* USER CODE END 3 */

この例では、まず送信データバッファとして1バイト符号なし整数uint8_tの配列msg[]を作り、文字列”hello world!”と改行コード”\n\r”で初期化しています。
次にUART1のハンドルのポインタと、配列msg[]のポインタを指定し、strlen()関数でバッファのバイト数を求め、100msをタイムアウト時間として指定しています。

マウスに書き込んで実行すると、Tera Termに次のように表示されます。

printfを使ったシリアル通信

HAL_UART_Transmit()を使ってもいいのですが、引数がたくさんあって毎回書くのは面倒です。というわけで、お馴染みののprintfを使えるようにします。

まず、main.cにstdio.hのインクルードを追加します。

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

次に、標準出力をUARTに出力する関数を定義します。ちなみにこのとき、Srcフォルダにsyscalls.cファイルが必要です。

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int __io_putchar(int ch) {
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100);
    return ch;
}
/* USER CODE END 0 */

setbuf()は入出力に使用するバッファを設定する関数です。ここでは標準出力stdoutにNULLを指定してバッファを使わないよう設定しています。こうしないとprintfがうまく動かないようです。

  /* USER CODE BEGIN 2 */
  setbuf(stdout, NULL);
  /* USER CODE END 2 */

無限ループの中で、printf()を呼び出します。今度は”hello printf!”が表示されます。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    printf("hello printf!\r\n");
  }
  /* USER CODE END 3 */

実行した結果、目論見通り”hello printf!”が出力されました。

次回

次回からはマウスに搭載した各種センサの動作確認をしたいと思います。


Posted in DCマウス研修