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

更新しました Apr 19, 2024

使用製品

ソフトウェア

  • LabVIEW

ドライバ

  • NI-VISA

問題

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

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

解決策

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


VISA読み取り関数は、次のいずれかの条件を満たすと、読み取りを停止します。
  • 読み取りバイト数で指定した文字数を読み取る
  • 終端文字を受信する
  • シリアルポートからデータがなくなり、データが受信されずにタイムアウト時間が経過する
  • VISAシリアルポート構成終端文字を有効入力にFalseを配線している

NI-VISAの終端文字の設定については、以下の関連リンクを参照してください。
標準プロトコル(Modbusなど)を実装する場合は、既存のライブラリを使用することを検討してください。

追加情報

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


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

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