Armadilloフォーラム

シリアル入出力で、RS-232Cに対するCのselect関数

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ポート間のシリアル通信のプログラムの一部なのですが、
ここでプログラムが止まってしまい、処理が行われずに困っております。

何かご存じの方がいらっしゃいましたら、教えてください。

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

コメント

izawa

2016年5月6日 10時40分

毎度お世話様、izawa@ittoです。
与えられた情報からできる対処は次の通り。
・実際にデータが来ているのか確認する。
プロトコルアナライザーか、なければオシロスコープでも事が足りますね。
「来ている筈」ではなく、確認する事をお勧めします。
・タイムアウトを設定する。
select()の第5パラメータはタイムアウトの設定です。
これがNULLですと、データが来ない限り永遠にブロックします。
適切にタイムアウトを設定しておけば、データの有無に関わらず指定した時間+αで復帰します。
そうすれば、呼び出し側でタイムアウト処理をするなり対処もできます。

尚、select()は「ブロックせずに読み込み可能」であるか監視しますので、
データ未到着では復帰しませんし復帰したからといってデータがあるとは限りません。

stone

2016年5月9日 18時03分

コメントありがとうございます。

タイムアウト設定をしていなかった件、ご指摘の通りです。
データがある場合にselect()を実行するように変更して、解決いたしました。
どうもありがとうございました。

y.nakamura

2016年5月7日 1時18分

中村です。

> このselectは、/dev/ttymxc1 (RS-232C) に対して行っています。

ttymxc1は、デフォルトではコンソールになっていると思います。
コンソールを無効にするか、コンソールをttymxc1以外の
別のポートに切り換えるなどしていますか?

--
なかむら

stone

2016年5月9日 18時07分

コメントありがとうございます。

> > このselectは、/dev/ttymxc1 (RS-232C) に対して行っています。
>
> ttymxc1は、デフォルトではコンソールになっていると思います。
> コンソールを無効にするか、コンソールをttymxc1以外の
> 別のポートに切り換えるなどしていますか?

コンソールはttymxc2 に変更して、ttymxc1を入出力に使用しています。

データの有無を確認してselect()を実行するように修正して、解決いたしました。
どうもありがとうございました。