• 公開日:2025年09月18日
  • | 更新日:2025年10月01日

初めての!UART通信による送受信制御

はじめに

車載システムにおける通信制御は、マイコン開発の中でも重要な要素の一つです。特にUART(Universal Asynchronous Receiver/Transmitter)通信は、シンプルながらも多くの場面で活用されており、初学者にとっても理解しやすい通信方式です。

本記事では、Renesas製マイコン「RH850/F1K」を用いて、UART通信による送受信制御を実装した開発実習の内容を紹介します。開発では、CS+などの統合開発環境のセットアップ、UARTの初期化処理の実装、送受信処理の確認、そしてデバッグツールを用いた動作検証まで、段階的に作業を進めました。まずは目標としたシステムの概要を示し、開発中に直面した課題やその解決策を具体的に解説します。

また、実際に動作している様子も画像を通して紹介し、初めてRH850シリーズに触れる方や、組み込みソフト開発に挑戦する方が、実践的な知識を得られるよう構成しています。

「UART通信ってどうやって始めればいいの?」「RH850での組み込みソフト開発ってどんな流れ?」そんな疑問を持つ方に向けて、開発のリアルな流れとノウハウをお届けします。

 

開発概要

使用環境・開発ツール

本開発において、使用した環境および開発ツールは以下の通りです。

・ボード            : HSBRH850F1K100
・マイコン           : RH850/F1K
・IDE              : CS+forCC(V8.11.00)
・コンパイラ        : RH850ビルド・ツールCC-RH(V2.06.00)
・エミュレータ      : E1エミュレータ
・ターミナルエミュレータ:Tera Term(V5.3)

実現機能

UART通信による送受信制御

確認方法

TeraTermにて文字出力

開発システム概要

以下の図は、本開発で構築したUART通信による送受信制御システムの概要を示しています。

まず、PCのキーボードより数字データ(0~9)を入力いたします。

入力されたデータは、図中の黄色枠の通信経路に沿って、UART通信を通じてMCU(RH850/F1KM-S1)へ受信されます。MCUは受信したデータを解析し、再度UART通信を通じてTeraTermへ送信します。

・入力が数字(0~9)であれば、そのままTeraTerm上に表示されます。
・入力が数字以外の文字だった場合、MCUはそれを「無効なデータ」と判断し、TeraTermにはエラーを示す “E” を表示します。

さらに、通信中にMCUが**UARTのエラー(オーバランエラー/フレーミングエラー)**を検知した場合は、7セグメントLEDに “E” を点灯させて、視覚的にエラーを通知します。

このシステムにより、受信データの判定処理とエラー検出・通知機能を組み合わせた、基本的なUART通信制御の流れを実現しています。

 

要求仕様

CPU初期化

【ターゲットマイコン】

・名称(マイクロコントローラ名):RH850/F1K(R7F701581)
・ピン数                         :100pins
・Code Flash                 :2048KB
・Data Flash                 :64K
・Local Ram                 :128KB
・Trance Ram               :32KB
・動作温度範囲              :-40℃~105℃
・オシレータ特性               :外部水晶のクロックは16MHzとする。

 

【CPU初期化】

■CPU システム(RH850/F1K ユーザーズマニュアルハードウェア編 第3章)に関係する初期化
RH850/F1Kを動作させるため、CPUに対して初期化を行う。

■オプションバイト(RH850/F1K ユーザーズマニュアルハードウェア編 第37章 37.9)の設定でWOTAの制御
オプションバイト領域を設定可能にするため、オプションバイトの初期化設定を行う。

■CS+のスタートアップのboot.asmでRAMの初期化
RH850/F1Kを動作させるため、RAMの初期化(ゼロクリア)を行う。

■割り込み(RH850/F1K ユーザーズマニュアルハードウェア編 第7章)に関係する初期化
割込みの初期設定を行う。

■LIN/UART インタフェース(RH850/F1K ユーザーズマニュアルハードウェア編 19章)に関する初期化
UART通信の為、シリアル通信の初期化設定を行う。

■端子(RH850/F1K ユーザーズマニュアルハードウェア編 第2章)の設定

■クロックコントローラ(RH850/F1K ユーザーズマニュアルハードウェア編 第12章)に関係する初期化
RH850/F1Kを動作させるため、端子設定およびクロックコントローラの初期設定を行う。

 

UART初期化

■UART通信の概要

本システムにおけるUART通信の概要は以下の通りです。

1.PCなどの外部機器から送信されたデータが、RLIN3nRX端子を通じてMCUに入力されます。
2.データは内部RLIN3nRXラインを経由してLINコントローラに渡され、解析・処理されます。
3.処理結果や応答データは内部RLIN3nTXラインを通じて送信準備されます。
4.最終的に、RLIN3nTX端子から外部へUART信号として出力されます。

■ユニット名
・ユニット           :2
・送信             :P10_14/RLIN32TX
・受信             :P10_13/RLIN32RX

■送信割込み発生タイミング:送信完了時

■受信割込み発生タイミング:受信完了時

■エラー検知
エラーを検知する項目を以下に示します。
・ビットエラー(送信したデータと、受信端子でモニタしているデータが一致しなかったとき)
・オーバランエラー(RLIN3nLURDRレジスタに受信データ格納後、データの読み出し前に、次のデータを受信したとき)
・フレーミングエラー(受信処理において、1ビット目のストップビットがロウレベルであったとき)

■ステータス割り込み発生タイミング
・ビットエラーの発生時
・オーバランエラーの発生時
・フレーミングエラーの発生時

■ボーレート:9600bpm

■送受信のデータ長:8ビット

■転送フォーマット:MSBファースト

 

実装の流れ

状態遷移図

以下の図は、本システムにおける状態遷移を示したものです。状態遷移図は、システム内部でのデータ処理の流れを視覚的に把握するための有効な手段であり、入力から出力までの各ステップが明確に定義されています。本図には、割り込み処理やエラー検知といった実用的な設計思想が反映されており、システムの動作理解やデバッグ、機能拡張の際に非常に役立ちます。

以下に、各ステップの概要を簡潔に解説します。

  1. キーボード入力:ユーザーとのインタフェース
    処理の起点は、ユーザーによるキーボード入力です。ここで、数字を入力します。

 

  1. ASCII変換:文字コードへの変換
    キーボードからの入力は、まずASCIIコードに変換されます。入力された文字列がシステム内部で扱いやすい形式に変換され、文字情報が数値として扱えるようになり、後続の処理が可能になります。

 

  1. 受信処理と割り込み:イベント駆動型の設計
    ASCIIコードに変換されたデータは「受信」ステートに入り、ここで処理されます。受信が完了すると、割り込みが発生し、次の処理ステップへと移行します。送信完了時にも同様に割り込みが発生し、非同期処理が可能となっています。

 

  1. データ解析:分類と判定
    受信したデータは解析され、以下の2種類に分類されます:
    ・数字データ:正常な数値として認識されたデータ
    ・エラーデータ:不正な形式や処理不能なデータ
    この分類により、後続の処理が分岐します。数字データはそのまま表示され、エラーデータの場合はErrorの「E」が表示されます。

 

  1. 出力処理(送信・表示)
    分類されたデータは送信ステートを経て、再度ASCIIコードに変換されます。最終的に、以下の出力先へ送られます:
    ・TeraTerm:ユーザーが確認できる文字列として表示。
    数字データはそのまま表示され、エラーデータは「E」として表示されます。
    ・LEDポート:LED表示時にはステータス割り込みが発生し、システムがエラー状態を認識します。
    エラー検知時にはLEDに「E」が表示され、ステータス割り込みが発生します。

 

フローチャート

本フローチャートは、UART通信を用いたシステムの処理手順を視覚的に整理したものです。システムの起動からデータの受信・判定・送信、そしてエラー処理や出力までの流れを、分岐条件を含めて順序立てて示しています。

各ステップは実装時に必要となる処理の流れを明確にし、特にエラー発生時の対応や判定条件が視覚的に把握できるよう設計されています。これにより、開発者は全体の構造を理解しやすくなり、トラブルシューティングや保守作業の効率化にもつながります。下記より各処理の詳細について、解説していきます。

  1. システム起動と初期化
    処理は「開始」から始まり、まずCPUの初期化が行われます。続いてUART通信の初期化が実施され、通信環境が整えられます。その後、LINリセットモードからUARTモードへの変更が行われ、受信準備が整います。
  1. データ受信と変換
    システムは受信待ち状態に入り、外部からの入力を待機します。入力されたデータはASCIIコードに変換されて受信され、受信完了の確認 が行われます。受信が正常であれば、データは受信データ用レジスタに格納されます。
  1. エラーチェックとデータ判定
    次に、受信データにエラーがないかを確認します。エラーが検出された場合は、エラー検知処理 に移行します。エラーがなければ、データが数字かどうかを判定します。数字でない場合は、”Error” というエラーデータを送信用レジスタに格納し、通知 処理へ進みます。
  1. データ送信と最終確認
    数字データであれば、送信用レジスタに格納 され、送信動作および送信完了の確認が行われます。送信が完了していない場合も、エラー検知処理に移行します。送信完了後、再度 エラーの有無を確認 し、エラーがあれば “E” を 3秒間LED表示 した後、LEDを消灯させます。
  1. 出力と終了
    最終的に、正常なデータは TeraTerm に出力され、処理は「終了」します。

 

苦労点と解決策から学ぶ、UART開発の注意点

苦労点① 受信前に送信が行われる不具合

【プログラムを開始すると受信動作の前に送信動作が行われてしまう】

本実装において、プログラムの起動直後に送信動作が先行してしまうという予期せぬ挙動が確認されました。

上の図は、期待するmain動作のフローチャートの大枠を示しております。

図の通り、本来UART通信を用いた処理で期待するmainの動作としては、各種初期設定後に受信待機状態に入り、受信データに応じて送信処理が行われるべきです。しかし、実際の動作では、右図のように、受信が行われていないにもかかわらず送信処理が実行され、TeraTerm上には何も表示されないという問題が発生しました。

 

期待される動作は以下の通りです:
プログラム開始⇒各種初期設定⇒受信待機⇒受信完了後に送信処理⇒TeraTermに出力
一方、実際の動作は次のようになっていました:
プログラム開始⇒各種初期設定⇒受信処理(未受信状態)⇒送信処理(空データ)⇒TeraTermに何も表示されず終了

 

このように、受信処理が完了していない段階で送信処理が進行してしまうことが、プログラムの意図した動作と大きく乖離しており、根本的な修正が必要です。次章では、この問題の原因と解決策について詳しく考察します。

 

原因調査① 受信前に送信が行われる不具合

【送信処理が先行する背景】
本来、UART通信においては受信処理が完了した後に送信処理が行われるべきですが、今回の実装では何も受信していない状態で送信処理が開始されてしまうという不具合が発生しました。この挙動から、送信動作の初期設定に問題がある可能性が高いと考えられました。

 

【UART初期設定の見直し】

原因を特定するため、UARTの初期設定コードを詳細に確認しました。

上の図は、UART初期設定の一覧(実際のCS+設定画面)となります。各レジスタの設定値を順に確認していく中で、特に送信データレジスタの扱いに注目しました。

 

以下は問題となった初期化コードです。

・送信データレジスタの初期化 RLIN31.LUTDR.UINT16 = 0x0000;

このコードは、送信データレジスタを初期化する目的で「0」を代入したものです。私はこの時点で、通信開始前にレジスタをクリアしておく必要があると考えていました。しかし、実際にはこの操作が送信トリガーとして認識されてしまい、”0″というデータが送信されたと判断されて、割込み要求が発生していたことが判明しました。

この挙動は、UARTの仕様により「送信データレジスタに値が書き込まれた時点で送信処理が開始される」為であり、初期化目的であっても送信とみなされてしまうことが原因でした。

 

解決策① 送信レジスタ初期化の見直し

原因が特定されたことで、次に行ったのは送信レジスタの初期化処理の見直しです。

  • 誤った初期化の影響
    RH850/F1Kのユーザーズマニュアル(UM)のRLN3nLUTDR-UART送信データレジスタを確認すると、「このレジスタにデータを書き込むことにより送信が開始します」と記載されています。つまり、UARTの送信データレジスタ(RLIN3nLUTDR)は、値が書き込まれた時点で送信処理が開始されるという仕様を持っています。この仕様を理解せず、初期化目的で RLIN31.LUTDR.UINT16 = 0x0000; と設定した結果、”0″というデータが送信されたと判断され、割込み要求が発生してしまいました。これにより、意図しない送信が行われ、TeraTermには何も表示されないという現象が発生していたのです。なお、バッファ送信を使用する場合は別レジスタで制御されるため、ソフトウェアでの初期化が問題にならないケースもあります。この違いは、UARTの送信方式によってレジスタの扱いが異なることを示しています。

 

  • 解決策の実施
    この問題に対しては、送信レジスタの初期化処理そのものを削除することで対応しました。今回の実装では送信に RLIN3nLUTDR を使用していたため、初期化処理が送信トリガーとなる仕様を踏まえ、初期化を行わないことが正しい対応となりました。

 

苦労点と解決策から学ぶ、UART開発の注意点①

・UARTのレジスタ仕様は機能によって動作が異なるため、同じUARTでも選択した送信方法により扱い方が異なる。
・バッファ送信の場合は別レジスタで制御されるため、ソフトウェアでの初期化が問題にならないケースもある。
⇒レジスタの仕様を正確に理解した上で初期化処理を設計することが重要!

 

苦労点② TeraTermに表示されない不具合

【送信完了しているのにTeraTermに表示されない】
UART通信の実装において、送信動作が完了しているにもかかわらず、TeraTerm上にデータが表示されないという現象が発生しました。
作成したプログラムを再生し、送信完了割込みの部分を確認すると、PC側では文字入力に対して送信完了割込みが発生しており、通信自体は成立しているように見えます。しかし、表示がされないという点から、受信または送信データに問題がある可能性が考えられました。そこで、各データが格納されるデータ格納レジスタの中を確認いたしました。

 

原因調査②:送信完了しているのに表示されない理由

【なぜ送信動作は完了しているのにデータが表示されないか】
この現象の原因を調査するため、受信・送信データ格納レジスタの値をウォッチ機能で確認しました。

– PCから入力された値は’5’であり、期待される受信データは、‘5’のASKIIコードである0x35(0011 0101)です。
– しかし、実際に受信データ格納レジスタに格納されていた値は `0xAC(1010 1100)`でした。
– プログラムの仕様上、0xACが受信データとして格納されると、0xACは数字のASCIIコードではない為、数字以外のデータと判定されてしまいます。
– その為、数字以外のデータを示す‘E’をTeraTermに表示すべく、送信データとしては‘E’のASCIIコード値0x45が格納されます。そして、そのまま送信された‘E’が表示されるはずですが、TeraTerm上には何も表示されない問題が発生しました。

 

上記現象を整理すると、受信データに期待値が入っていない、また格納された送信データがTeraTermに送信できていない、という問題が発生している事となります。

これらの問題を解決すべく、格納された受信/送信レジスタをよく確認したところ、受信データ格納レジスタがPC入力した数字のASCIIコード値のビット配置を反転した値と一致する事を発見しました。同様に、送信データ格納レジスタでも期待値と実際の値を比較した結果、送受信ともにビット順が逆転していることが確認されました。

 

このことから、UARTの通信フォーマットにおけるビット順(MSB/LSB)設定の影響が疑われました。

 

解決策②:ビット順設定の見直し

【UARTの通信フォーマットにおけるビット順(MSB/LSB)設定の影響】
調査の結果、UART初期設定においてMSBファーストが設定されていたことが判明しました。
これにより、送受信されるデータのビット順が逆転し、TeraTerm側で正しく認識されない状態となっていました。

 

【通信フォーマットの違い】

・LSBファースト:データは下位ビットから順に送信されます。
・MSBファースト:上位ビットから送信されるため、受信側とのフォーマットが一致しない場合、データが正しく解釈されません。

例:PC入力値 `’5’`(ASCIIコード:`0x35`)の送受信ビット配置
– LSBファースト:`0011 0101`
– MSBファースト:`1010 1100`(反転)

この設定をLSBファーストに変更することで、送受信データが正しく表示されるようになり、問題は解決しました。

 

UART開発の注意点②:設定の細部まで確認する重要性

UART通信では、初期設定のビット順(MSB/LSB)が送受信の成否に直結します。
通信が成立しているように見えても、表示されない・誤認識される原因はフォーマットの不一致にある可能性があります。
UARTの設定項目は多岐にわたるため、レジスタ設定の一つひとつを丁寧に確認することが重要です。

 

動作確認

送受信動作

図のように、数字を入力するとTeraTerm上にその数字が表示され、
数字以外のデータを入力するとエラーデータを示す‘E’が表示されることが確認出来ました。

エラー検知時

図のように、送受信上でのエラーを検知すると、7セグメントLEDに「E」が点灯することが確認出来ました。
これらより、正常なUART送受信動作およびエラー動作を実現することができたと言えます。

本記事で紹介した事例は、UART通信に限らず、組み込み開発全般において「仕様理解」と「初期設定の精査」がいかに重要かを示すものです。今後においても、マニュアルの読み込みとレジスタ動作の確認を徹底することで、トラブルの未然防止につながると考えます。

出典

(1)ルネサスエレクトロニクス,RH850/F1K ユーザーズマニュアル ハードウェア編,Rev.1.10,2016.12発行

お問い合わせはこちら

ルネサス製マイコンRH850シリーズ、RH850/F1Kを用いたUART通信にご興味頂けた方は、メーカーページをぜひご覧ください!

RH850車載用マイクロコントローラ(MCU)