マイコン内での変数やらの値を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辺りに、
char rxbuf[1];
char txbuf1[] = "'A' pressed\r\n";
char txbuf2[] = "'B' Pressed\r\n";
char txbuf3[] = "Other Pressed\r\n";
と記述して置きます。
次に、while文を
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とかを使って通信ができます。
文字化けしているときはボーレートが合っているかや、文字コードの設定を見直しましょう。