UARTのタイムアウト

PC(親基板)からUartで18バイト受信して処理を行うプログラムを作成しています。

R_UART0_Receive((uint8_t *)RECV_DATA0, 18);

で受信処理をしていて、通常は正常に動作しているのですが、お客様の親基板側のマイコンリセット時に

Uartにノイズがのってしまて、18バイトが送られてこないので、Uartが受信完了にならず、プログラムが

正常に動作しなくなります。

コード生成ツールを使用してプログラムを作成しておりますが、想定していないバイト数の受信をした時に

対応する方法はありますでしょうか?

  • さん、鈴木と申します。

    タイムアウト機能がありませんので、タイマ割り込みなどで、タイムアウトを監視するのがよいと思います。

    タイムアウト時の処理としてPCへの再送要求、マイコン側の再受信処理などが考えられます

    以上、よろしくお願いします

  • チョコです。

    まず、システムとして、どれくらいでタイムアウトと判断するか、タイムアウトと判断された場合にどうするかを明確にする必要があります。

    コード生成にはそのような機能はないので、コード生成されたコードをそのまま使わないことをお勧めします。どうしても、使いたければ、1キャラクタ受信を繰り返すことです。そのうえで上位のソフトで受信完了までの時間を管理して、おくことになるでしょう。

    どちらかというとお勧めするのは「サンプルプログラム等」に私が投稿した「RL78コード生成へのリングバッファ追加」を使うことです。

    UARTの送信はコード生成されたコードを使っても構いませんが、受信は起動しないでください。RL78コード生成へのリングバッファ追加」には、UARTが受信したデータをリングバッファ格納します。格納したデータの管理を行うAPIが準備されているので、それを使えば、好きな時に受信データをチェックして読み出すことも可能です。5年前に作成したので細かいところは覚えていませんが、リングバッファのデータ数を確認したり、リングバッファから複数バイトのデータを読み出す機能もサポートしています。

    https://japan.renesasrulz.com/cafe_rene/m/sample_program/306

    以上