シリアルデバイス上のVISA読み取りで要求されたバイト数が返されない

更新しました Dec 24, 2018

使用製品

Software

  • LabVIEW

Driver

  • NI-VISA

問題

VISAを使用してシリアルポートでバイナリデータを受信しようとしています。

たとえば、VISA読み取りVIまたはviRead()呼び出しを使用して100バイトを要求します。しかし、受信したデータを見ると、最初の63バイトしか取得できないことがあります。別の読み取りをおこなうと、残りの37バイトを読み取ることができます。VISA読み取りVIを再度使用して、最初の読み取りで54バイト、2回目の読み取りで残りの46バイトを読み取ります。なぜこのような問題が発生するのですか?

解決策

シリアルでのVISA読み取りは、シリアルポートバッファからプログラムにバイト数を返します。ただし、返されるデータ量は、設定やシリアルデータに関する3つの重要な情報(終端文字、要求されたデータ量、タイムアウト時間)によって決まります。


VISA読み取りは、次のいずれかのステートメントがTrueの場合、読み取りを停止します。
  1. 要求されたバイト数は、ポートで読み取ることを待機しているバイト数以下である。
    または
  2. 終端文字が受信された。
    または
  3. シリアルポートからデータがなくなり、データが受信されずにタイムアウト時間が経過した。
  4. VISAシリアルポート構成終端文字を有効入力にFalseを配線します。

NI-VISAの終端文字の設定については、以下の関連リンクを参照してください。

標準プロトコル(Modbusなど)を実装する場合は、既存のライブラリを使用することを検討してください。

追加情報

LabVIEWにあるシリアル通信のサンプルプログラム(NIサンプルファインダ>>ハードウェア入力と出力>>シリアル>>簡易シリアル)を確認すると、VISAシリアルシリアル構成VIから始まることが分かります。これにより、終端文字(デフォルトは16進数0A( "改行"))とタイムアウト(デフォルトは10秒)の両方が設定されます。


シリアルデータと設定した終端文字と一致するバイトを読み取っている場合、VISA読み取りVIはこれが要求されたデータの最後であると想定し、読み取り操作を停止します。これは、条件1が満たされず、VIがポートからすべてのバイトを読み取っていなくても、上記の第2の条件が満たされているために発生します。

デフォルトの終端文字を使用すると、通常のテキスト通信では問題は発生しません。ただし、バイナリデータには0x0Aバイトに特別な意味が割り当てられていません。上記の例では、最初の読み取り操作が63バイト後に停止し、ソフトウェアバッファ内の残りの37バイトが読み取られるのを待つ理由があります。シリアル経由でバイナリデータ転送を行っている場合は、ほとんどの場合、VISAシリアルシリアル構成VIで終端文字を無効にします。

この記事はお役に立ちましたか?

いいえ