From 04:00 PM CDT – 08:00 PM CDT (09:00 PM UTC – 01:00 AM UTC) Tuesday, April 16, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

NI製品ディスカッション

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

TCPでのデータ受信の遅延・切断について

解決済み
解決策を見る

TCPで計測器からのデータを送り込んでチャートに表示するviを開発しています。

 

TCPサーバのサンプルを利用して開発を行っているのですが、通信の遅延・切断が頻発します。

Tera Termを利用して送られてくるデータを見ると、遅延等は起きず、うまく通信ができています。

 

計測器からのデータは1秒ごとに無線モジュールからルーターに送られ、無線LANを通じてPCに送っています。

データは30文字ほどの英数字です。

使用しているviのデータ受信部分のみのviを添付しております。

こちらの使用環境はWindows8.1、LABVIEW2013です。

 

何か問題点がありましたら教えていただけないでしょうか?

0 件の賞賛
メッセージ1/6
6,594件の閲覧回数

こんにちは。

 

気になった点をいくつか。

 

・遅延や切断というのはタイムアウトのエラーが発生しているということでしょうか。もしくは別のエラーが発生しているのでしょうか

 

・読み取りの関数でタイムアウトと読み取るバイト数を指定していますが、

 タイムアウトを長めに設定したり、読み取るバイト数を少なくすると動作は変わりますか。

 あと30文字なので30バイトと設定されている様ですが、想定以上のデータ量が送られている可能性はありますか(ヘッダ情報や終端文字など)

 

・一度読み取りの関数が実行してデータ量が0バイト以上であれば、

サーバーのセッションを閉じて、再度セッションを開く動作になっている様です。

セッションを開き続けた状態でデータが来るのを待機してみてはいかがですか。

 

 

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

ご返信ありがとうございます。

 

タイムアウトのエラーに関しては、ご指摘の通りセッションを開き続けた状態でデータが来るのを待機することで解消されました。

ありがとうございます。

 

そこでまた新たな問題が出てしまいました。

計測器からのデータは、「%d,%d,%d,%d,%d,%d,\n」の形式で送られ、それぞれの%dには計測結果が入ります。

そのため、データのバイト数が測定結果によって変動します。

これによってデータを一行ずつうまく読み取れないという問題が発生しています。

 

TCP読み取り関数のCRLFモードを使えればいいのですが、終端文字がLFだけのためなのかうまく動作しません。

現状Immediateモードを使用して、実行開始後1分ほどはデータのバイト数以上を読み込んでしまい、うまく読み取れないのですが、

時間がたつとデータのバイト数ちょうどを読み取るようになり、うまく動作します。

 

またTCP読み取り関数のタイムアウトを変えたり、読み取るバイト数を少なくするとデータを読み取らなくなることがあるのですが、

これはなぜかご教授いただけないでしょうか?

 

使用しているviのデータ受信部分のみのviを添付しています。

また何か問題点がありましたら教えていただけないでしょうか?

 

 

0 件の賞賛
メッセージ3/6
6,516件の閲覧回数
解決策
トピック作成者Shun77が受理

一番簡単なのは、計測器の設定で送られるバイト数をヘッダなどで予め伝える様に設定するか、

同じバイト数を送る様に設定する方法かと。ただ、もちろん計測器の設定でできなければプログラム的に

データ受信を対応させる必要があります。

 

LabVIEWヘルプによるとImmediate モードであれば、指定したバイト数よりも少ないバイトが受信されても

1バイトでもデータが来ていればタイムアウトのエラーが発生しないみたいです。

ですので、現在のプログラムの状態で受信し続け、データを後処理で分ける方法で問題ないかと。

 

ただループがひとつ余分だったことと、受信している文字列のデータをまとめて確認するために、

連結追加を使って再度試してみてください。(添付スクリーンショット)

 

メッセージ4/6
6,478件の閲覧回数

ご返信ありがとうございます。

 

スクリーンショットのようにviを変更した結果、ほぼうまく動作し、一行ずつデータを読み取れるようになりました。

ありがとうございます。

 

厚かましいですが、もう一つ質問させてください。

添付のviを使って計測器から送られてくる「%d,%d,%d,%d,%d,%d,\n」形式のデータの3番の%dの値をチャートに表示しているのですが、

viを実行した直後の数秒だけうまく読み取れない状態になっています。

一秒間に一回だけチャートにプロットされるはずなのに、データが溜まっていたかのようにダダダダとプロットがされる状態です。

 

もし原因がお分かりでしたらお教えいただけますか?

よろしくお願いいたします。

すべてをダウンロード
0 件の賞賛
メッセージ5/6
6,436件の閲覧回数

LabVIEW についている実行ボタンとは別にVI 内で実行ボタンを用意しているのが原因なのではないかと。

 

添付されたVI の状態ですと、VI 内の実行ボタンを押さずとも、TCPのセッションが開かれ

通信データが既に受け取られたまっている状態になります。ワイヤで順番付けされていない時のLabVIEWの並列処理ですね

 

VI 内の実行ボタンが必要であれば添付スクリーンショットを参考にしてみてください

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