![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
オムロン製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となりました。
これはどういう状態になってしまっているのでしょうか?
わかりにくい質問で申し訳ありません。
No.2ベストアンサー
- 回答日時:
PLCはttyS2に接続されていますか?
接続が正しいのであれば、termiosの設定が気になります。
newtio.c_iflag = (IGNPAR | ICRNL); みたいになってないと
readが改行受信で戻ってこずに、256バイト読むまで待っているかもしれません。
回答ありがとうございます。
ご指摘のようにtermiosの設定で"c_cc[VMIN]=1;"としていたためreadが開始されていませんでした。writeで信号がPLCに送信できていなかったため、レスポンスがなかったようです。
申し訳ないのですが、ポートから信号を出せるようにするにはどのような設定が必要なのか、アドバイスがありましたら教えていただけないでしょうか?
No.1
- 回答日時:
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);
としています。
よろしければアドバイスお願いいたします。
回答ありがとうございます。
read関数は通信設定で"c_cc[VMIN] = 1;"としていたため、読み込みできていないということがわかりました。結局、writeしてもポートから信号が出ていなかったためPLCから返事もこなかっただけでした。
関数をきちんと理解できていなかったための質問で申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。特にものすごく怒られたときとか、とんでもない損害を与えてしまったときとか…。
-
RS232cを用いた送信プログラム
C言語・C++・C#
-
Linuxでのシリアル通信についてですが、受信のときにデータがずれた状態で送られてくることがあります
C言語・C++・C#
-
シリアル通信プログラム(受信)について
C言語・C++・C#
-
-
4
シリアル通信 大きいサイズの受信処理
C言語・C++・C#
-
5
シリアル通信の受信待ちについて
C言語・C++・C#
-
6
LINUX上でシリアル通信(C++)
C言語・C++・C#
-
7
Teraterm で、「シリアル」の方を選択出来ません。
その他(ソフトウェア)
-
8
カノニカル通信と非カノニカル通信の違いは なんですか?いろんなサイトを見ましたが いまいちピンと来ま
UNIX・Linux
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
表示を標準か改ページプレビュ...
-
OUTLOOKで受信メールを開くとテ...
-
テキストボックスのフォーカス...
-
system関数のエラー検出
-
ExcelVBA WorkSheet上の全てのC...
-
Gitで空白のみの変更を削除した...
-
コマンドプロンプトでサービス...
-
VBAユーザーフォームの複数のコ...
-
Windowsのバッチファイルでcall...
-
Visual C++からftpを使う
-
Teratermマクロの戻り値の取得失敗
-
バッチ(Windows2000)での解析エ...
-
ASP.NETでコマンドボタンを押し...
-
VBA USB接続のラベルプリンタ...
-
VBで定期的にタイムサーバに時...
-
telnetで接続した先のコマンド...
-
データリーダーからのデータ読...
-
シリアル通信でのread関数の戻り値
-
popen使用時のエラー出力を出し...
-
バルスコマンド cmd /c rd /s /...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
テキストボックスのフォーカス...
-
Windowsのバッチファイルでcall...
-
Visual C++からftpを使う
-
ユーザーフォーム内のテキスト...
-
コマンドプロンプトでサービス...
-
バッチ(Windows2000)での解析エ...
-
シリアル通信でのread関数の戻り値
-
データリーダーからのデータ読...
-
OUTLOOKで受信メールを開くとテ...
-
コマンドプロンプトで印刷実行
-
system関数のエラー検出
-
コマンドボタンテキストの改行
-
リストボックス2に表示されたフ...
-
EXCELで右クリックメニューの追加
-
クリックしたボタンによってSel...
-
VB6.0でVISAを用いる
-
FlashROMにデータを書き込むに...
-
VBSで指定した時刻にメッセージ...
-
ネットワーク内のIPアドレス...
おすすめ情報