STM32 と Raspberry Pi間で UART 通信

**はじめに**
STM32L432 上で UART通信を行う場合の手順です。
ここでは、相手側から "GetVersion" という文字列(コマンド)が 送られて来た場合、
"Ver 1.10" と送り返します。

相手側は、UART通信を行えるデバイスであれば良いかと思います。
これに対応デバイスを Raspberry Pi とした時のサンプルコードは、下記を参考。
[https://qiita.com/ytetsuo/items/502ddcb0430a41dcaed4](https://qiita.com/ytetsuo/items/502ddcb0430a41dcaed4)


[こちらも参考：https://qiita.com/ytetsuo/items/7b1086391b6ba0d35fe4](https://qiita.com/ytetsuo/items/7b1086391b6ba0d35fe4)

---
**STM32CubeMXでの設定**
UART1_TX を PA9 / UART1_RX を PA10 に割り付ける。
この時、NVIC Setting(割込み) にチェックを入れておくこと。

尚、UART2 は STM32で受信したデータを Tera Term に表示させるために使用している。
[https://qiita.com/ytetsuo/items/f5697418961d8a909dd3](https://qiita.com/ytetsuo/items/f5697418961d8a909dd3)
ここで 説明している ソースコードの修正も必要です。(以下には、触れていません)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/bb055552-6457-c41c-0d10-d0b19fb8c73c.png)


**上記の設定で 生成されたソースコードを修正する**
修正するコードは、main.c のみ!!
※STM32が受け取った文字列を Tera Term に出力不要な 場合には、printf() を削除して下さい。

~~~mainc.c
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************

～ 省略 ～

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

～ 省略 ～

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
__IO uint8_t uart_status;
uint8_t uartbuff[30];
uint8_t version[18]="Ver 1.10\r\n\r\n";
/* USER CODE END 0 */

～ 省略 ～

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    uart_status = 0;
    memset( uartbuff, 0x00, sizeof(uartbuff) );
    if( HAL_UART_Receive_IT( &huart1, uartbuff, 11 ) == HAL_OK )
    {
      while( uart_status != 4 )
      {
        switch( uart_status )
        {
          case 0:
            break; /* recive complete wait */

          case 1: /* recive complete.*/
//          printf("Command:%s\r\n", (uint8_t *)uartbuff);
            if(strcmp((uint8_t *)uartbuff, "GetVersion\r")==0)
            {
              uart_status = 3; /* get command (request Version*/
//            printf("Command:%s\r\n", (uint8_t *)uartbuff);
            }
            else
            {
              uart_status = 4; /* Reset */
              printf("Command Error!!\r\n");
            }
            break;

          case 2:
            break; /* transmit complete wait */

          case 3: /* send response */
            if(HAL_UART_Transmit_IT( &huart1, version, strlen((char const *)version)) == HAL_OK)
            {
              printf("Response:%s", (uint8_t *)version);
            }
            break; /* end */

          case 4:
            break; /* end */

        } /* end of switch */
     } /* end of while */
   } /* end of if */
  }
  /* USER CODE END 3 */
}

～ 省略 ～

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if( &huart1 == huart )
  {
    uart_status = 1;
  }
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  if( &huart1 == huart )
  {
    uart_status = 4;
  }
}/* USER CODE END 4 */

~~~

---
☆2021年11月 9日(火) 午後3時30分 初版(Ver1.00) 作成

---