Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_3(UART通信:複数文字送信)

​​​​

UART通信を行う(UART通信で複数文字列の送信表示)

 

1.本日の内容

 (1) STM32マイコン(nucleo f401RE)を使用して、UART通信を行う。
 (2) UART通信を行い、Teratermに下記言葉を連続出力を表示する。
  ・Hellow world
  ・test
  ・こんにちは
  ・fine

 

・目次

 

2.内容

​​(1) やる内容の詳細

  ・nucleof401でUART通信を行い、PCと通信を行う。
​  ・mbed起動時に、TeraTermに下記言葉を表示する。
   
・Hellow world
   ・test
   ・こんにちは
   ・fine


 

(2) 使用部品​
個数 部品名 型番
1 USBケーブル USBミニBタイプ
1 mbed(マイコンボード) ​​nucleo f401RE

​​


(3) STM32CubeMXの設定、プログラムを出力

  (a)使用ピンを設定
   ・PA2:USART2_TX
   ・PA3:USART2_RX
   
  (b)使用するピンの名前を変更 
   ・PA2→右クリック→Enter Username→USART_TXとする。
   ・PA3→右クリック→Enter Username→USART_RXとする。

  (c)Connectivity(USARTの基本設定)
   ・USART2を選択
   ・Mode:Asynchronous(非同期で行う)
   ・Hardware Flow Control :Disable (ハードウェアのフロー制御なし)
   ・NVIC Settingsを開く→USART2 global interruptのEnabledにチェックを入れる。
   ・Parameter Settings→今回はそのままで
     ・Baud Rate  :115200Bits/s
     ・Word Length  :8Bits
     ・Parity       :None
     ・Stop Bits   :1

  (d)System Core
   ・NVICを選択
   ・USART2 global interrupt部分をクリック
   ・Preemption Priorityを0から1に変更
   これで、マイコンの設定は終了

  (e)プログラムの出力
   ・Project Maagerを選択
   ・Project Nameにプログラムの名前を入力:Practice_USART2
    ※スペース、空白文字、日本語を含めるとエラーになる場合があるので、使用しない。
   ・Project Location:プロジェクトを保存する場所
   ・Application Structure:Advanced (出力するフォルダの構成を選択)
   ・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)

  (f)GENERATE CODEで、コードを出力
  (g)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。

・下記動画の2分13秒までの内容を参照


(4) AtricTrueStdioでプログラム作成
  (a) AtricTrueStdioから開く場合(上記(g)をした場合は不要)
    ・AtricTrueStdioを起動
    ・インポート元のディレクトリをクリック
    ・CubeMXで作成した場所を指定
    ・フォルダーにPractice_USART1(作成したプロジェクトの名前)が表示
    ・チェックされているのを確認して、終了をクリック 


 (b) プログラムの書き込み
   ・トンカチマークをクリックして、ビルドする。
   ・エラーが出ないことを確認する。

   ・下記プログラムを記載する。

/* USER CODE BEGIN 2 */
  //複数文字列の送信
   uint8_t uartbuff[12][12] ={"Hello world","Test","こんにちは","fine"};
   HAL_UART_Transmit(&huart2,&uartbuff[0][0],sizeof(uartbuff),100);
/* USER CODE END 2 */

(5) TeraTermの設定
 (a) 日本語の表示
    ・設定→端末→漢字-受信をSJISに変更
    ・これをしないと、日本語(こんにちは)が文字化けする。


 (b) ボーレートの設定
   ・設定→シリアルポート→スピードを1152000に変更(STM32 CubeMXのBaud rateと同じ数)

(6) プログラムの説明

 (a)  uint8_t uartbuff[12][12] ={"Hello world","Test","こんにちは","fine"};
   ・複数文を送る場合は、2次元配列を使用する。
   ・1個めのが文の数、2個めのが文字数の最大数となる。
   ・例えば、上記が[1][12]となると、"Hellow world"のみが送られる。
   ・[12][2]となると、"He""Te""こ"fi"が送られる。

 (b)  HAL_UART_Transmit(&huart2,&uartbuff[0][0],sizeof(uartbuff),100);
   ・基本変わらない。
   ・2次元配列の場合、sizeofは使用できるが、strlenは使用できない。
   ・第二引数に&が付く。 なんでなのかはわからない。

(7) その他
  (a)改行を入れる。
/* USER CODE BEGIN 2 */
 uint8_t uartbuff2[7][7] ={"Hel\r\n","Tes\r\n","こん-\r\n","fin\r\n","123456789\r\n"};
   HAL_UART_Transmit(&huart2,&uartbuff2[0][0],sizeof(uartbuff2),100); 
/* USER CODE END 2 */

   ・\r\n で改行を入れる。
   ・テキストの改行を表現する方法は、システムによって下記3パターンが存在する。
   ・その表現方法が使われている代表的なOS
     → \n(LF):Unix系OS全般、Mac OS X
     → \r\n(CR+LF):Windows系OS
     → \r(CR):古いMac OS(9以前)

出力結果


  (b) 1文の選択出力 

/* USER CODE BEGIN 2 */
  //2次元配列から、1個の文のみを出力
   uint8_t uartbuff3[15][15] ={"Hello world\r\n","Test\r\n","fine\r\n"};
   HAL_UART_Transmit(&huart2,&uartbuff3[0][0],sizeof(uartbuff3[0]),100); //Hellow worldのみ出力
   HAL_UART_Transmit(&huart2,&uartbuff3[1][0],sizeof(uartbuff3[1]),100); //Testのみ出力
   HAL_UART_Transmit(&huart2,&uartbuff3[2][0],sizeof(uartbuff3[2]),100); //fineのみ出力
/* USER CODE END 2 */


出力結果

   ・送信する&uartbuff3の左カッコの数によって、送信する文字を選択
   ・sizeof(uartbuff3
)で、配列の文字サイズを取得している。
sizeofの出力確認:
https://paiza.io/projects/oxaOHXaGJKuQaBg-EzZx4g?language=c
 

3.関連記事

組み込みC言語: