プロが教えるわが家の防犯対策術!

ある計測機器(以後(A)と略記)と"一般的な"Linux PC(Kernel 2.4xx)とをRS232Cシリアルポートで接続し、コマンドの送信とデータの受信を一定時間間隔(1秒)で行うためのC言語プログラムを作成しようとしています。第一段階として、Windows XPのソフトウェア:ハイバーターミナルで(A)にコマンドパケット(10バイト程度)を送信し、それに対応するデータ(20バイト程度)を(A)の取り扱い説明書どおり、正しく受け取ることができました。(A)の受け付ける通信データフォーマットは”8 data bits, 1 stop bit, no parity bit"で、通信ケーブルはいわゆる3線式で、フロー制御は用いません。通信レートは9600baudです。
 (A)から返される20バイト程度(長さはまちまちです)のデータパケットは全て、最後が[;FF]の"アルファベット3文字"で終わっていて、いわゆる”行末コード”は付加されていません(取扱説明書でも確認ずみ)。このような場合に、linux上でのC言語プログラムで(A)が接続された/dev/ttyS* (*は一桁の数字)から、どのような入力モードでread()すればよいか、アドバイスをお願いいたします。事前調査の段階ですが、今考えている方法は
(1)ループの中で、ノンブロッキングモードでひと文字ずつ読んで、自分で用意したバッファに納めつつ、その最後が";FF"になったらループを脱出する
というものですが、制御用のLinux PCは他にも”作業をしていて”、(A)とのデータの授受の負荷は軽いほどよいので、より賢明な方法がないか探しています。
たとえば、
(2)カノニカルモードで、一時的に、”行末コード”にセミコロン";"を指定して、read()する
などということは可能でしょうか。これが可能なら、次の"FF"は、2文字を指定して”読み捨てる”ことも可能になります。
わかりにくい説明で恐縮ですが、他のアイデアなどを含めて、アドバイスをお願いいたします。

A 回答 (1件)

ノンブロッキングモード、read毎に、1ミリ秒のスリープ処理を挟むだけで、CPUはほとんど使用されない状況になると思います。

また1行受信も1文字ずつ20バイト受信も、処理効率に大差はないと思います。
例えば、1000Hzのデータで、数百のチャンネルのデータをリアルタイムに受信するなどの仕様であれば、CPUの並列化(どのCPUコアにどのチャンネル読み込みを割り当てるかなど)を検討する必要が出てきます。
が、シリアル通信で9600bpsのデータを1秒毎、ということであれば、小細工なしに、実装して評価するのが良いと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!