dポイントプレゼントキャンペーン実施中!

オムロン製PLCと上位コンピュータをRS232Cで接続し、FINSコマンドを用いてシリアル通信をしようとしています。
現在作っているプログラムの流れは、

・シリアルポート"/dev/ttyS2"のオープン
  comm_fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY);
・通信設定
  termios構造体を設定
・コマンドフレーム(COMMAND)を作成し、ポートに書き込む
  write(comm_fd, &COMMAND, strlen(COMMAND));
・PLCからのレスポンスを読み出す
  read(comm_fd, &RESPONSE, 256);

のようにしているのですが、read関数が実行されたままになってしまいます。(エラーコードも返ってこない状態です)
readの戻り値が-1ならポートにアクセスできていないとわかるのですが…

ためしにcomm_fdと違う値をread関数に入れてみたところ(read(6, &RESPONSE, 256)、戻り値は-1となりました。

これはどういう状態になってしまっているのでしょうか?
わかりにくい質問で申し訳ありません。

A 回答 (2件)

PLCはttyS2に接続されていますか?


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

回答ありがとうございます。

ご指摘のようにtermiosの設定で"c_cc[VMIN]=1;"としていたためreadが開始されていませんでした。writeで信号がPLCに送信できていなかったため、レスポンスがなかったようです。

申し訳ないのですが、ポートから信号を出せるようにするにはどのような設定が必要なのか、アドバイスがありましたら教えていただけないでしょうか?

お礼日時:2008/08/12 09:29

PLCはちゃんとコマンドを受け取って返信しているの? それを確かめた?


通信速度その他の通信設定が違ってて通信できてないんじゃないの?
RS232Cなんて基本的に無手順で垂れ流しだから上手く通信できなきゃいつまでも結果が返ってこないからreadから戻らないでしょ。

この回答への補足

追加の質問で申し訳ありません。
いろいろ試しているのですが、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);
としています。

よろしければアドバイスお願いいたします。

補足日時:2008/08/12 09:23
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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

お礼日時:2008/08/12 09:22

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

このQ&Aを見た人はこんなQ&Aも見ています