• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:シリアル通信でのread関数の戻り値)

シリアル通信でのread関数の戻り値について

このQ&Aのポイント
  • オムロン製PLCと上位コンピュータをRS232Cで接続し、FINSコマンドを用いてシリアル通信をしようとしています。
  • read関数が実行されたままになってしまい、-1となる戻り値が返ってきます。
  • ポートにアクセスできていない可能性があります。質問の内容がわかりにくくても構いませんので、詳細をお教えください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

PLCはttyS2に接続されていますか? 接続が正しいのであれば、termiosの設定が気になります。 newtio.c_iflag = (IGNPAR | ICRNL); みたいになってないと readが改行受信で戻ってこずに、256バイト読むまで待っているかもしれません。

noname#157805
質問者

お礼

回答ありがとうございます。 ご指摘のようにtermiosの設定で"c_cc[VMIN]=1;"としていたためreadが開始されていませんでした。writeで信号がPLCに送信できていなかったため、レスポンスがなかったようです。 申し訳ないのですが、ポートから信号を出せるようにするにはどのような設定が必要なのか、アドバイスがありましたら教えていただけないでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

PLCはちゃんとコマンドを受け取って返信しているの? それを確かめた? 通信速度その他の通信設定が違ってて通信できてないんじゃないの? RS232Cなんて基本的に無手順で垂れ流しだから上手く通信できなきゃいつまでも結果が返ってこないからreadから戻らないでしょ。

noname#157805
質問者

お礼

回答ありがとうございます。 read関数は通信設定で"c_cc[VMIN] = 1;"としていたため、読み込みできていないということがわかりました。結局、writeしてもポートから信号が出ていなかったためPLCから返事もこなかっただけでした。 関数をきちんと理解できていなかったための質問で申し訳ありません。

noname#157805
質問者

補足

追加の質問で申し訳ありません。 いろいろ試しているのですが、writeしてもポートから信号が出ていません。 PLCのシステム設定で、通信速度9600、データ7ビット、2ストップビット、偶数パリティとしています。 プログラム側の設定は、  tio.c_cflag &= ~(CSIZE | PARODD | HUPCL);  tio.c_cflag |= CS7 | CLOCAL | CREAD |PARENB | CSTOPB;  cfsetospeed(&tio, B9600);  cfsetispeed(&tio, B9600); としています。 よろしければアドバイスお願いいたします。

すると、全ての回答が全文表示されます。