stone
2016年5月2日 19時49分
お世話になります。
アットマークテクノさんのサイトの
C言語による実践プログラミングの
6.5. シリアルポートの入出力 を参考に、プログラムを作っております。
シリアルポートの入出力プログラムにて、
ret_a = select(nfds_a, prdfds_a, pwrfds_a, NULL, NULL);
上記のようにselect 関数を使用したところ、処理が返ってこなくなりました。
このselectは、/dev/ttymxc1 (RS-232C) に対して行っています。
これの前に、同様に /dev/ttyUSB0 (USBポート)に対しても行っていますが、そちらはちゃんと処理が返ってきます。
このプログラムは、ArmadilloのRS-232CとUSBポート間のシリアル通信のプログラムの一部なのですが、
ここでプログラムが止まってしまい、処理が行われずに困っております。
何かご存じの方がいらっしゃいましたら、教えてください。
よろしくお願いいたします。
コメント
stone
y.nakamura
stone
izawa
2016年5月6日 10時40分
毎度お世話様、izawa@ittoです。
与えられた情報からできる対処は次の通り。
・実際にデータが来ているのか確認する。
プロトコルアナライザーか、なければオシロスコープでも事が足りますね。
「来ている筈」ではなく、確認する事をお勧めします。
・タイムアウトを設定する。
select()の第5パラメータはタイムアウトの設定です。
これがNULLですと、データが来ない限り永遠にブロックします。
適切にタイムアウトを設定しておけば、データの有無に関わらず指定した時間+αで復帰します。
そうすれば、呼び出し側でタイムアウト処理をするなり対処もできます。
尚、select()は「ブロックせずに読み込み可能」であるか監視しますので、
データ未到着では復帰しませんし復帰したからといってデータがあるとは限りません。