VISAを使用してシリアルポートのフロー制御をするとバッファオーバーフローが発生する

更新しました Jun 18, 2019

使用製品

ドライバ

  • NI-VISA

オペレーティング・システム

  • Windows
  • NI Linux Real-Time

その他

  • PXI/CompactPCIコントローラ

問題

シリアルポートがバッファオーバーフローを報告しており、NI-VISAをハードウェアまたはソフトウェアのフロー制御で使用しています。フロー制御がFIFOオーバーフローを防止しないのはなぜですか?

解決策

この問題は、いくつかの要因によって引き起こされる可能性があります。これには、コンピュータの速度、使用しているボーレート、シリアルポートのFIFOのサイズ、データをシリアルポートに送信している計測器のFIFOサイズなどが含まれます。

フロー制御は、特定のバイト数がバッファに入るまで待機してから、プロセッサに送信を終了するためにメッセージまたは信号を他のデバイスに送信するように要求します。より高いボーレートでは、シリアルポートはバッファフロー制御レベルに達してから送信が停止するまでに数バイトを受信します。優先度の高いプロセスがリアルタイムターゲットのプロセッサを制御している場合は、これらの余分なバイトが入ります。プロセスはVISA割り込みよりも優先度が高いため、リアルタイムプロセッサで優先度の高いプロセスが終了するまでプロセッサは何もしません。

デバイスが送信デバイスにメッセージを送信しようとすると、16バイトFIFOのデフォルトのVISAとWindowsの設定は14バイトになり、FIFOに2バイトを残します。より遅いコンピュータでボーレートが高い場合、シリアルポートがプロセッサに信号の送信を要求してから最後に送信を停止するまでに4バイト以上を受信する可能性は十分あります。

 

LabVIEW Real-TimeまたはNIシリアルハードウェアを使用する

MAXを起動して、デバイスとインタフェースの下にある問題が発生しているシリアルポートに移動します。COMポートをクリックすると、右側のペインに詳細設定タブが表示されます。これらの設定では、受信バッファサイズを小さくすることができます。問題が解決するまで、バッファサイズを小さくする必要があります。
 

システムの負荷(例えば、優先度の高いタスクやループで長い時間を費やすなど)によっては、シリアルハードウェア処理タスクが不足する可能性が高くなります。これは、シリアルハードウェアが十分に利用可能でないため、RX FIFOのオーバーランが増える可能性があります。これを回避するには、NI-Serialの割り込み処理モードを設定します。割り込み処理モード設定の詳細については、NI-Serialヘルプの「Performance on LabVIEW Real-Time」を参照してください。この設定は、Cシリーズモジュールには影響しません。

 

Compact RIOおよびFieldPointの場合

MAXを起動してコントローラに接続されたシリアルポートでは、詳細設定タブは表示されません。このタブを使用してハードウェアフロー制御ラインを呼び出す要求レベルを設定する代わりに、コントローラにあるファイルを変更する必要があります。コントローラのc:\ni-rt\systemディレクトリにあるniserial.dbsファイルを変更します。 SerialPortName = "COM1"の直下に次の行を追加します。

RXFIFO = 1

RXFIFOの可能な値は、1、4、8、14です。このファイルを変更すると、ハードウェアフロー制御のトリガレベルを変更できます 。

 

Windowsの場合

この問題を解決するには、Windowsでデバイス マネージャーを開く必要があります。次に、設定を変更するCOMポートを見つけて、そのプロパティを開きます。 詳細設定]ブをクリックするとスライダが表示され、受信バッファのサイズを変更できるようになります。これにより、UARTによってフロー制御がより早く有効になります。 
 

 
ほとんどの場合、デフォルト値で十分です。ただし、バッファオーバーフローエラーが発生した場合は、この値を小さくする必要があります。これにより、より多くの割り込みがプロセッサに送られ、バイトがUARTに送られます。この値を大きくすると、バイトがFIFOバッファをオーバーフローする可能性があります。

追加情報

シリアル通信では、プロセッサでVISA処理のバッファサイズ、FIFO設定、ボーレート、および優先順位を理解することが重要です。