UARTを使ってみる

今回はUART機能を使ってパソコンとデータ送受信をしてみます。UARTは簡単に言うと昔のCOMポート通信のことです。昔のパソコンにはCOMポート(RS232C)が付いていましたが、今のパソコンはほぼ全てUSBに変わってしまいCOMポートは付いていません。なのでソフトウェアでCOMポートをエミュレートした仮想COMポートというのを使います。STM32 ST-LINK Utilityをインストールすると仮想COMポートがインストールされます。パソコン側はターミナルソフトを使ってデータの送受信をします。ターミナルソフトも昔からある古い通信ソフトウェアです。映画でハッカーがターミナルソフトを使ってネットハッキングしてるシーンとか良くありますね。ターミナルソフトはパソコン間の通信だけでなくインターネットへも接続できます。もしターミナルソフトが無ければダウンロードしてインストールしてください。有名なのはTeraTermです。TeraTermを起動すると下の様にDOS窓に似たコンソールウインドウが表示されます。


TeraTermを起動してシリアルポートの設定ダイアログを表示します。Nucleo側と同じ通信設定にしなければ上手く通信が出来ません。ボーレート(通信速度)はもっと速くできますが余り速過ぎるとデータエラーが増えます。


Nucleo-F401REではデフォルトでUART2を初期化するとパソコンと通信が出来るようになります。

CubeMXで新しいプロジェクトを作ります。プロジェクト名はNucleoF401RE UARTにします。左側のPinoutウインドウでUSART2のModeをAsynchronusに設定すると、MCUのPA2PA3が緑色に変わります。NucleoF401REは3個のUSARTを持っていますがボードの配線からパソコンと接続できるのはUSART2になります。


Configurationページへ移ってUSART2の設定をします。


GPIO SettingでGPIOの設定をします。PA2,PA3共に同じ設定です。


GPIO Pull-up/Pull-dowm : Pull-up
Maximum output speed : High


USART2_TXが送信(Transmit)、USART2_RXが送信(Recieve)になります。


UART通信は負論理なのでHIGH/LOWが逆の意味になります。通信では無信号時に電力消費の少ない負論理を使う事が多いです。負論理では信号ラインはVDD(正電源)でプルアップされます。


Parameter SettingタブでUARTの通信設定をします。これはTeraTermの通信設定と同じにします。


CubeMXの設定はここまでです。初期化コードを出力してからCoIDEのプロジェクトを作成してください。やり方は「CubeMXを使ってみよう!」「CoIDEのプロジェクトを使おう!」を参考にしてください。


通信プログラムは以下の通りです。Srcフォルダの中にmain.cがあります。


※コメントは削除しました

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART2_UART_Init();


 char *msg = { "1~4までのキーを押してください。\r\n" };
 HAL_UART_Transmit( &huart2, msg, strlen( msg ), 0xFFFF );

 char *strings[] = { "Good Morning\r\n", "Good afternoon\r\n", "Good night\r\n", "Hello\r\n"  };
 char v;


 while (1)
  {
   if( HAL_UART_Receive( &huart2, &v, 1, 0xFFFF ) == HAL_OK )
   {
    switch( v )
    {
     case '1': HAL_UART_Transmit( &huart2, strings[ 0 ], strlen( strings[ 0 ] ), 0xFFFF ); break;
     case '2': HAL_UART_Transmit( &huart2, strings[ 1 ], strlen( strings[ 1 ] ), 0xFFFF ); break;
     case '3': HAL_UART_Transmit( &huart2, strings[ 2 ], strlen( strings[ 2 ] ), 0xFFFF ); break;
     default : HAL_UART_Transmit( &huart2, strings[ 3 ], strlen( strings[ 3 ] ), 0xFFFF ); break;
    }
   }
  }
}


このプログラムではターミナルソフト(TeraTerm)で1~4までのキーが押されると、それに応じた文字列を表示します。UARTでデータの送受信が出来ていることが確認できます。


ターミナルソフトの起動には順番があります。NucleoをUSBケーブルで接続してからターミナルソフトを起動しないと上手く接続できません

TeraTermで日本語を表示するにはメニューからSetup->TerminalでKanji(recieve/transmit)にSJISを指定します。


UART通信は余り高速なデータ通信はできませんが、データ線を長くすることができます。RS232C仕様では数十メートルまで良いそうです。非同期シリアル通信ですからデータを送るだけなら信号線は1本で済みます。