![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
オムロン製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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- 英語 The more books you read, the more you’ll know. この文 2 2022/04/16 14:06
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- USBメモリー・SDカード・フラッシュメモリー 銀行が振込データの受け渡しに未だにFDを使っている理由は「FDDがAドライブ固定だから」って本当? 11 2022/06/02 03:53
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- 英語 【 論・表 受動態 】 問題 ※写真の② 私の解答 This novel was read by m 3 2022/06/24 19:15
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
Linuxでのシリアル通信についてですが、受信のときにデータがずれた状態で送られてくることがあります
C言語・C++・C#
-
RS232cを用いた送信プログラム
C言語・C++・C#
-
ソケット通信内 read関数について
C言語・C++・C#
-
-
4
シリアル通信プログラム(受信)について
C言語・C++・C#
-
5
シリアル通信の受信待ちについて
C言語・C++・C#
-
6
read関数をノンブロッキングで実行する(c言語)
C言語・C++・C#
-
7
シリアル通信でのデータ受信
C言語・C++・C#
-
8
シリアル通信 大きいサイズの受信処理
C言語・C++・C#
-
9
正負を反転させて出力するプログラム
C言語・C++・C#
-
10
カノニカル通信と非カノニカル通信の違いは なんですか?いろんなサイトを見ましたが いまいちピンと来ま
UNIX・Linux
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
Windowsのバッチファイルでcall...
-
Visual C++からftpを使う
-
シリアル通信でのread関数の戻り値
-
VBで、このようなことはどうや...
-
コマンドプロンプトでサービス...
-
クリックしたボタンによってSel...
-
データリーダーからのデータ読...
-
テキストボックスのフォーカス...
-
Office 2011 VBA フォルダ作成
-
バルスコマンド cmd /c rd /s /...
-
コマンドボタンテキストの改行
-
AutoHotkey KeyWaitコマンドに...
-
telnetで接続した先のコマンド...
-
GP-IB通信を別PCでモニタしたい
-
cisco2600ルータについて
-
VBで定期的にタイムサーバに時...
-
C# のスレッドに、上位から値を...
-
ExcelVBA WorkSheet上の全てのC...
-
バッチ(Windows2000)での解析エ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
テキストボックスのフォーカス...
-
Windowsのバッチファイルでcall...
-
Visual C++からftpを使う
-
system関数のエラー検出
-
データリーダーからのデータ読...
-
コマンドプロンプトで印刷実行
-
バッチ(Windows2000)での解析エ...
-
ユーザーフォーム内のテキスト...
-
gmailでのimap設定
-
FlashROMにデータを書き込むに...
-
ネットワーク内のIPアドレス...
-
コマンドプロンプトでサービス...
-
C言語のコマンドの"flag"って何...
-
VBで定期的にタイムサーバに時...
-
リストボックス2に表示されたフ...
-
コマンドボタンテキストの改行
-
ExcelVBA WorkSheet上の全てのC...
-
OUTLOOKで受信メールを開くとテ...
-
jqコマンドでor条件でIPを指定...
おすすめ情報