※ ChatGPTを利用し、要約された質問です(原文:RS232C通信のC言語プログラム:入力モード?)
C言語プログラムでRS232C通信の入力モードを設定する方法
このQ&Aのポイント
RS232C通信を使用して計測機器とLinux PCを接続し、C言語プログラムでコマンドの送受信を行いたい場合、入力モードの設定が重要です。
通信データフォーマットや通信ケーブルの仕様、通信レートなどを考慮し、正しい入力モードでread()を行う必要があります。
ノンブロッキングモードやカノニカルモードなどを使用して、効率的にデータの受信を行う方法を検討しましょう。
ある計測機器(以後(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文字を指定して”読み捨てる”ことも可能になります。
わかりにくい説明で恐縮ですが、他のアイデアなどを含めて、アドバイスをお願いいたします。