マイコン内での変数やらの値をPCで読むためによく使うUART通信の備忘録。
厳密にいうと違いますが、UART通信はシリアル通信の上位互換的なものなので、シリアル通信をしたいときもこれでいけます。
今回は、stm32のf303k8を使いました。
使用環境
- OS:Windows10 Home
- CPU:i5-6200U
- IDE:System Workbench for STM32
- STM32CubeMX(初期コード作成に使用)
初期コード作成
いつも通り、CubeMXで初期コードを作成していきます。
ボードを選択した後、PinoutのUSART1のModeをAnsynchronousに設定します。
するとPA9、PA10が緑色になり、それぞれUSART1_RX、USART1_TXになると思います。
ここまで来たら、ConfigurationでUSARTの設定をします。
ボーレートはあまり大きくし過ぎると通信エラーのもとになるようなのでほどほどにします。
このボーレートは送信側、受信側が合わせていないときちんと受信できません。
メイン関数
次はメイン関数の内容です。
といってもCubeMXにてペリフェラル周りのコードは作成してあるので、USRT用の送信バッファ、受信バッファを用意して、無限ループ内で受信、又は送信のコードを追加するだけです。
まずUAER CODE BEGIN 0辺りに、
1 2 3 4 5 | char rxbuf[1]; char txbuf1[] = "'A' pressed\r\n"; char txbuf2[] = "'B' Pressed\r\n"; char txbuf3[] = "Other Pressed\r\n"; |
と記述して置きます。
次に、while文を
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | while (1) { HAL_UART_Receive(&huart1, (uint8_t *)rxbuf, sizeof(rxbuf), 0xF); if(rxbuf[0] != 0){ if(rxbuf[0] == '1'){ HAL_UART_Transmit(&huart1, (uint8_t *)txbuf2, sizeof(txbuf2), 0xFFFF); rxbuf[0] = 0; }else if(rxbuf[0] == '2'){ HAL_UART_Transmit(&huart1, (uint8_t *)txbuf3, sizeof(txbuf3), 0xFFFF); rxbuf[0] = 0; }else if (rxbuf[0] == '3'){ HAL_UART_Transmit(&huart1, (uint8_t *)txbuf4, sizeof(txbuf4), 0xFFFF); rxbuf[0] = 0; }else{ HAL_UART_Transmit(&huart1, (uint8_t *)txbuf1, sizeof(txbuf1), 0xFFFF); rxbuf[0] = 0; } } |
これで、PCでTeratermとかを使って通信ができます。
文字化けしているときはボーレートが合っているかや、文字コードの設定を見直しましょう。