LoginSignup
1
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-18

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
が決まりました。

61-1-1-1.jpg
61-1-1-2.jpg

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

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

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

61-1-1-3.jpg

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

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

それでは、プログラムを作ってみましょう。
61-1-1-4.jpg

  /* 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を押すと消灯、それ以外だと点灯消灯が切り替わると思います。

1
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
7