STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (6)  UARTを使ってみよう(2)


STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (5)  UARTを使ってみようの続きです。

今回は、受信した文字に応じて動くプログラムを作ってみましょう。
case文を使って、条件分岐し、LEDを動かすプログラムを作ります。
同じような記事がどこかにあったのですが、見つけれませんでした。
類似の資料として以下2つのサイトがありますので、こちらもぜひご覧ください。

・STM32でUARTをやってみる2
http://gsmcustomeffects.hatenablog.com/entry/2017/03/23/120043
・UARTを使ってみる
https://nucleo87.webnode.jp/nucleo%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/uart%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%EF%BC%81/

まずは、プログラムの内容を考えてみしょう。
TeraTermなどで文字を受信すると、その内容によりLEDが点灯したり、消灯したりしたいと思います。
まずは、文字を受信するプログラムを書いてみます。
HAL_UART_Receiveが文字を受信するプログラムです。
使用するポートはhuart2です
pDataには、受信する文字列を入れる名前です。
今回は、revとします。
このため、intやcharなどで revを定義しましょう。
int やcharは、文字を入れたいか、数字を入れたいかで決めましょう。
sizeは入れるサイズで、timeoutは適宜入れましょう。
char rev;
HAL_UART_Receive(&huart2,&rev,1,3000
が決まりました。


もし、xxと受信したらLEDを点灯させる
今回は、1と入れたらLEDが点灯する、2を入れたら消灯するとします。

switch(rev)
{case '1':~~~

となります。
ちなみに、最後に「== HAL_OK」が必須です。

ここまで来て、動かない時に、なぜだろうか?と思う時があると思います。
なので、本当に押したキーを認識するかのプログラムを追加しましょう

前回と同じように作ってみましょう。
char rec1[] ="Receive1\r\n";
HAL_UART_Transmit(&huart2,(uint8_t *)rec1,sizeof(rec1),1000);

それでは、プログラムを作ってみましょう。

  /* USER CODE BEGIN 2 */
   char msg[] ="Hello STM32\r\n";
   char msg2[] ="PushButton\r\n";
   char rec1[] ="Receive1\r\n";
   char rec2[] ="Receive2\r\n";
   char nonans[] ="Not Understand \r\n";

   char rev;

   HAL_UART_Transmit(&huart2,(uint8_t *)msg,sizeof(msg),3000);

  // HAL_UART_Transmit(&huart2,(uint8_t *)msg,strlen(msg),3000);

   /* USER CODE END 2 */
     /* USER CODE BEGIN 3 */
       if(HAL_UART_Receive(&huart2, &rev, 1, 1000)==HAL_OK){
           switch(rev)
                   {
           case '1':
                       HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin,1);
                       HAL_UART_Transmit(&huart2,(uint8_t *)rec1,sizeof(rec1),3000);
                       break;
           case '2':
                       HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin,0);
                       HAL_UART_Transmit(&huart2,(uint8_t *)rec2,sizeof(rec2),3000);
                       break;
           default:
                       HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
                       HAL_UART_Transmit(&huart2,(uint8_t *)nonans,sizeof(nonans),3000);
                       break;
                   }
       }
   }
  /* USER CODE END 3 */

うまく動くと、1を押すと、LEDが点灯し、2を押すと消灯、それ以外だと点灯消灯が切り替わると思います。