Armadilloフォーラム

シリアル通信 受信バッファ 保存

inuneko

2024年4月24日 16時18分

いつもお世話になっております。

armadillo640を使用しています。
C言語プログラムでuartを使用して送受信を使用しています。
現在armadillo側を受信、PCを送信としています。
PC側から送信した文字列はarmadilloのハードウェアの受信バッファに一時的に保存されたりするのですか?
また、CRLFが文字列にない場合はバッファに保存されないとかあるのでしょうか?

よろしくお願いいたします。

コメント

at_ohsawa

2024年4月24日 18時34分

> PC側から送信した文字列はarmadilloのハードウェアの受信バッファに一時的に保存されたりするのですか?

はい、どちらの質問もLinuxのシリアルポート一般の話ですが、ハードウェアのバッファと
Linuxカーネル内のソフトウェアのバッファの両方に保存されます。
ハードウェアのバッファからLinuxカーネル内のバッファへの移動はLinuxカーネルが
自動で行っているので、ユーザーは全く意識するものではないです。

> また、CRLFが文字列にない場合はバッファに保存されないとかあるのでしょうか?

保存されないわけではなく、Cのtermiosの設定によってread関数を呼んだときに
上記のバッファから改行文字まで読み出すのか(これをカノニカルモードといいます)、
改行文字とは関係なく指定バイト単位で読み出すのか(非カノニカルモード)、
さらに、そのルールで読み出す物がない時にどうするのか。
等をioctlを使ってプログラムする必要があります。

このあたりの話は、かなり伝統的なLinux/Unixの基本なので、Armadilloに依存する部分が
無く、とても良い汎用なドキュメントがあります。
http://archive.linux.or.jp/JF/JFdocs/Serial-HOWTO.html

もちろん、ミスであれプログラムのループが適切に実装されていない等の理由であれ
読み出さずに放置すると、上記のバッファが溢れてデータが消えていきます。

読まずに放置は単なる実装ミスですが、プログラムの実行が間に合わない
(読み出したデータに対する処理が長い等)の場合は、読み出すプログラムと
処理するプログラムを別スレッドにしたマルチスレッドプログラミングをするか
(書いたこと無いのであれば、Cで書くのはおすすめしません。
使い慣れているのであればpython等の高級言語で便利なライブラリを使った方が
良い気がします。)

あるいは、単純にハードフロー制御を使ってuartの先に居るデバイスにデータを
送るのを待ってもらう。等の工夫が必要になると思います。