NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

シリアル通信の受信VIについて

解決済み
解決策を見る

RS232Cで不定期に送られてくる52バイトデータの受信側viで悩んでいます。

通常、「VISAシリアルポート構成」⇒「VISA読み取り」⇒「次のフロー」 というように

プログラムを書くと思いますが、困っているのはデータが不定期で送信されてくる通信系で、

「VISA読み取り」に入ると何らかのデータを受信しないとここから抜け出せなくなってしまうことです。

最初の「VISAシリアルポート構成」のタイムアウト設定ではなくオペレータの判断で、たとえば

「停止ボタン」操作でデータの受信待ちの状態から抜け出して、強制的に「次のフロー」へ移るviを

書きたいのですが、どのようにすればよいかご教示ください。よろしくお願いします。

0 件の賞賛
メッセージ1/14
2,917件の閲覧回数

平素よりNI製品をご愛顧頂きありがとうございます。
日本ナショナルインスツルメンツ技術部の上野です。

 

オペレータの判断以外は待機し続けたいのでしたら、タイムアウト値を-1に設定することでタイムアウトしないようになります。

 

ループの停止条件に停止ボタンとエラー配線をOr関数でまとめてから配線すれば、エラー時とオペレータによる判断のみでループを停止可能です。

0 件の賞賛
メッセージ2/14
2,870件の閲覧回数

早速のご連絡、ありがとうございます。

やってみましたが、停止ボタン”ON”でループから抜けて停止してくれません。

プログラムとjpegデータを添付しましたので、間違っているところを教えてください。

宜しくお願いします。

すべてをダウンロード
0 件の賞賛
メッセージ3/14
2,862件の閲覧回数

添付いただいたサンプルプログラムを確認しましたが、Whileループ内に待機関数がないため、高速にループしているはずです。ループ内に5ミリ秒くらいで構いませんので、待機関数を追加してお試しいただけますか?

 

それと、タイムアウトを設定しないと待ち続けてしまいます。これが原因でユーザによる操作に影響を及ぼすようでしたら、タイムアウトは設定して、タイムアウトエラーだけをエラークリア関数でクリアして再度読み取るような仕組みにする方法も考えられます。

0 件の賞賛
メッセージ4/14
2,857件の閲覧回数

ご提案、ありがとうございます。

ご提案の方法を理解できていないせいかもしれませんが、いろいろとviを修正してトライしてみましたがうまくゆきません。

受信データに応じてケースストラクチャーのTrueとFalseの切り替えコントロールができているかを表示機能を追加して調べましたが、問題ありませんでした。

それにしても、正常なデータを受信したときに「停止」ボタンを押して実行停止をしていたものが、「停止ボタン」を押しても機能しなくなってしまいました。

正常な「停止」状態になると、受信したデータをファイル保存するように作ったつもりですが、「停止ボタン」が反応しないために強制終了をさせるのでデータ保存されないことも困っています。

宜しくご示唆ください。

0 件の賞賛
メッセージ5/14
2,844件の閲覧回数

以前添付いただいたコードに提案した修正を加えてみましたのでお試しいただけますか?

 

実機のある環境でデバッグしないと正確な挙動を完璧には読み取れませんので、色々試していただき改善していければと思います。

0 件の賞賛
メッセージ6/14
2,838件の閲覧回数

大変お世話になります。ご提案をトライしました。受信データが正常な場合(+かーで始まり、”CR”か”LF”で終わった場合はほぼ期待通りの動きになります。

が、これ以外の条件のデータが来た場合は、FALSEへ行きますが、これ以降は「データ集録停止」SWを押しても反応しません。続いて正常なデータを受信してもやはりハングアップしてしまいます。

テストは別のPCからTeraTermでデータを送信して行っていますが、通信速度や送信データの組み合わせを変えてテストしても同じ状況です。さらにアドバイスがあればご教示ください。宜しくお願いします。

0 件の賞賛
メッセージ7/14
2,823件の閲覧回数

前回お送りした検証用コードはタイムアウトエラーを除外してループするようにしております。そのため、でおフォルトのタイムアウト(10秒)は待機します。停止ボタンが押された場合、タイムアウト時間を経過してからループを抜けることを想定しておりますが、タイムアウト時間を経過しても動作しないハングアップ状態になるということでしょうか?

 

VISAシリアルポート構成VIのタイムアウト入力により短いタイムアウト時間を設定すれば、停止ボタンの応答性は速くなると思いますが、短すぎると正しい動作する通信にも影響するかと思いますので、適切な値を色々お試しいただければと思います。

0 件の賞賛
メッセージ8/14
2,809件の閲覧回数

何度も申し訳ありません。様々なデータでチェックしたところ、1)受信データが+またはーで始まり、"CR"か”LF"で終了する53文字列であれば正常に処理(表示&データ保存)し、2)これと異なる場合(例えば50文字の文字列)の場合は、受信データの表示やデータ保存しないというように処理したいのですが、いろいろなデータを組み合わせた受信試験で分かったことは、2)の条件のデータが来ると受信文字数が不足するために、次の受信データの3文字を加えた53文字にして処理を行う、いわゆる受信文字列に文字ずれが起きてしまい、以後は正常なデータが来ても正常な文字列という判定ができないことが原因とわかりました。受信文字数が何文字か(何文字不足しているか)を判定するにはどうしたらよいかご教示ください。もう少しなので、お手数をおかけしますが、よろしくお願いします。

0 件の賞賛
メッセージ9/14
2,802件の閲覧回数

文字数が可変でしたら、バッファサイズを定数にする方法は望ましくないと思います。

 

関数パレットのシリアルサブパレットから「VISAシリアルポートバイト」を配置すると、出力端子をもつプロパティノードとなります。この出力値は受信したバイト数を返しますので、ループごとに受信したバイト数だけを読み取り、ケースストラクチャの条件判断に文字列長が53文字かどうかをAnd関数として追加すれば、それ以外は無視します。

 

変更例を添付致しますのでご確認ください。

0 件の賞賛
メッセージ10/14
2,792件の閲覧回数