コンテンツにスキップ

Serial Communication#

Serial Communicationカメラ機能を使用すると、カメラのI/Oラインを介してホストと外部デバイス間のシリアル通信を確立できます。

これは、カメラがホストと別のデバイス間の中間UARTデバイスとして機能することを意味します。

機能を使用する#

仕組み#

カメラには、送信(Tx)データ用と受信(Rx)データ用の2つの独立したシリアルポートFIFOがあります。ホストとの通信には、両方のFIFOが共通の転送バッファーを使用します。

Serial Communication図

上記のインターフェイスを使用するには、適切な通信プロトコルを実装する必要があります。プロトコルの実際の実装は、セットアップユーティリティとデバイスの特性によって異なります。

プロトコルの実装に役立つカメラパラメーターを以下に示します。

Serial Communicationの設定#

カメラと外部デバイス間のシリアル通信を設定するには、次の手順を実行します:

  1. BslSerialBaudRateパラメーターを外部デバイスのボーレート(例:Baud9600)に設定します。
  2. BslSerialNumberOfDataBitsパラメーターを外部デバイスが使用するデータビット数(例:Bits8)に設定します。
  3. BslSerialNumberOfStopBitsパラメーターを外部デバイスで使用されるストップビット数(例:Bits1)に設定します。
  4. BslSerialParityパラメーターを外部デバイスが実行するパリティチェックの種類(例:Even)に設定します。
  5. カメラの入力信号を設定します。これを行うには、BslSerialRxSourceパラメーターを、シリアルデータを受信するI/Oライン(例:Line2)に設定します。回線は入力として設定する必要があります。
  6. カメラの出力信号を設定します:
    1. LineSelectorパラメーターを、シリアルデータを送信するI/Oライン(例:Line3)に設定します。回線は出力として設定する必要があります。
    2. LineSourceパラメーターをSerialTxに設定します。

Serial Communicationのテスト#

外部デバイスをカメラに接続せずにシリアル通信をテストしたり、外部デバイスによるエラーを除外したりするには、BslSerialRxSourceパラメーターをSerialTxに設定します。

これによりループバックが発生します。シリアル入力は内部的にシリアル出力に接続されるため、カメラは伝送内容を正確に受信します。

データの送受信#

シリアル通信を設定した後、外部デバイスにデータを送信して、外部デバイスからデータを受信することができます。

情報

詳細については、「pylon APIドキュメント」のParametrizeCamera_SerialCommunication (C++)コードサンプルを参照してください。

Transmit and Receive Parameters#

次のパラメーターは、データの送受信の両方に関係します:

  • BslSerialTransferBuffer:転送バッファーには、送信されるデータが保持され、受信されたデータも格納されます。最大16個のシンボルを保持できます。シンボルは、BslSerialNumberOfDataBits設定に応じて7ビットまたは8ビットで構成されます。GigEカメラでは、転送長が4の倍数でなくても、DWORDS(4バイトの倍数)で転送バッファーにアクセスする必要があります。たとえば、BslSerialTransferLengthパラメーターを9に設定した場合、各トランザクションのバッファーから12バイトを読み取る必要があります。USBおよびCoaXPressカメラでは、この制限は適用されません。
  • BslSerialTransferLength:受信時に、最後のトランザクション中にカメラが受信したシンボルの数を示します。送信時に、カメラがトランザクションごとに送信するシンボルの数を指定します。最大値は16です。

Transmit Parameters#

データの送信には、次のパラメーターが関係します:

  • BslSerialTransmit:このコマンドを実行して、シリアル出力ラインを介して転送バッファーの現在の値を送信します。また、BslSerialTxFifoEmptyパラメーターとBslSerialTxFifoOverflowパラメーターの状態も更新されます。以下を参照してください。
  • BslSerialTxFifoEmpty:送信FIFOが空かどうか、つまりカメラがデータを送信する準備ができているかどうかを示します。
  • BslSerialTxFifoOverflow:送信FIFOがオーバーフローしたかどうかを示します。新しいデータが送信FIFOに以前のデータよりも高速に転送された場合、つまり、BslSerialTransmitコマンドを高速に実行した場合に、オーバーフローが発生します。オーバーフロー中に送信されたデータは、送信FIFOに書き込まれません。
  • BslSerialTxBreak:外部デバイスへのシリアルブレークを通知します。このパラメーターがtrueに設定されている場合、カメラはシリアル出力を低レベル(スペース)に設定して、ブレークを通知します。このパラメーターがfalseに設定されている場合、カメラはシリアル出力を高(マーク)にリセットします。

Receive Parameters#

データの受信には、次のパラメーターが関係します:

  • BslSerialReceive:このコマンドを実行して、シリアル入力ライン経由でデータを受信します。トランザクションが完了すると、BslSerialTransferBufferパラメーターには受信データが含まれ、BslSerialTransferLengthパラメーターには受信された有効なシンボルの数が示されます。また、このコマンドを実行すると、BslSerialRxFifoOverflowBslSerialRxParityError、およびBslSerialRxStopBitErrorパラメーターの状態が更新されます。以下を参照してください。
  • BslSerialRxFifoOverflow:受信FIFOがオーバーフローしたかどうかを示します。外部デバイスからの新しいデータが以前のデータよりも早く到着し、転送バッファーに移動してホストに送信された場合、つまり、BslSerialReceiveコマンドの実行速度が遅すぎる場合に、オーバーフローが発生します。オーバーフロー中に受信したデータは失われます。
  • BslSerialRxParityError:カメラが受信FIFOのデータでパリティエラーを検出したかどうかを示します。エラーが検出された場合、BslSerialReceiveコマンドを実行して受信FIFOを空にするまで、パラメーターはtrueのままです。
  • BslSerialRxStopBitError:カメラが受信FIFOのデータでストップビットエラーを検出したかどうかを示します。エラーが検出された場合、BslSerialReceiveコマンドを実行して受信FIFOを空にするまで、パラメーターはtrueのままです。
  • BslSerialRxBreak:外部デバイスがシリアルブレークを通知したかどうかを示します。シリアル入力が最低でも12ビット間、低レベル(スペース)にある場合、カメラはブレークを検出し、パラメーターをtrueに設定します。カメラは、ブレーク信号がどれくらい続くかを「認識」しないため、パラメーター値はtrueのままになります。これをfalseにリセットするには、外部デバイスがブレークの送信を完了していることを確認してから、BslSerialRxBreakResetコマンドを実行します。
  • BslSerialRxBreakResetBslSerialRxBreakパラメーターをfalseに設定します。上記を参照してください。

サンプルコード#

// Configure serial communication
// Example: 19200 Baud, 8 data bits, 2 stop bits, even parity
camera.BslSerialBaudRate.SetValue(BslSerialBaudRate_Baud19200);
camera.BslSerialNumberOfDataBits.SetValue(BslSerialNumberOfDataBits_Bits8);
camera.BslSerialNumberOfStopBits.SetValue(BslSerialNumberOfStopBits_Bits2);
camera.BslSerialParity.SetValue(BslSerialParity_Even);
// Configure the camera's input signal
camera.BslSerialRxSource.SetValue(BslSerialRxSource_Line2);
// Configure the camera's output signal
camera.LineSelector.SetValue(LineSelector_Line3);
camera.LineSource.SetValue(LineSource_SerialTx);
// Now, you must implement a suitable communication protocol.
// Camera parameters that help you implement the protocol are listed
// in the "Transmitting and Receiving Data" section above.
INodeMap& nodemap = camera.GetNodeMap();
// Configure serial communication
// Example: 19200 Baud, 8 data bits, 2 stop bits, even parity
CEnumParameter(nodemap, "BslSerialBaudRate").SetValue("Baud19200");
CEnumParameter(nodemap, "BslSerialNumberOfDataBits").SetValue("Bits8");
CEnumParameter(nodemap, "BslSerialNumberOfStopBits").SetValue("Bits2");
CEnumParameter(nodemap, "BslSerialParity").SetValue("Even");
// Configure the camera's input signal
CEnumParameter(nodemap, "BslSerialRxSource").SetValue("Line2");
// Configure the camera's output signal
CEnumParameter(nodemap, "LineSelector").SetValue("Line3");
CEnumParameter(nodemap, "LineSource").SetValue("SerialTx");
// Now, you must implement a suitable communication protocol.
// Camera parameters that help you implement the protocol are listed
// in the "Transmitting and Receiving Data" section above.
// Configure serial communication
// Example: 19200 Baud, 8 data bits, 2 stop bits, even parity
camera.Parameters[PLCamera.BslSerialBaudRate].SetValue(PLCamera.BslSerialBaudRate.Baud19200);
camera.Parameters[PLCamera.BslSerialNumberOfDataBits].SetValue(PLCamera.BslSerialNumberOfDataBits.Bits8);
camera.Parameters[PLCamera.BslSerialNumberOfStopBits].SetValue(PLCamera.BslSerialNumberOfStopBits.Bits2);
camera.Parameters[PLCamera.BslSerialParity].SetValue(PLCamera.BslSerialParity.Even);
// Configure the camera's input signal
camera.Parameters[PLCamera.BslSerialRxSource].SetValue(PLCamera.BslSerialRxSource.Line2);
// Configure the camera's output signal
camera.Parameters[PLCamera.LineSelector].SetValue(PLCamera.LineSelector.Line3);
camera.Parameters[PLCamera.LineSource].SetValue(PLCamera.LineSource.SerialTx);
// Now, you must implement a suitable communication protocol.
// Camera parameters that help you implement the protocol are listed
// in the "Transmitting and Receiving Data" section above.
/* Macro to check for errors */
#define CHECK(errc) if (GENAPI_E_OK != errc) printErrorAndExit(errc)
GENAPIC_RESULT errRes = GENAPI_E_OK;  /* Return value of pylon methods */
/* Configure serial communication */
/* Example: 19200 Baud, 8 data bits, 2 stop bits, even parity */
errRes = PylonDeviceFeatureFromString(hdev, "BslSerialBaudRate", "Baud19200");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "BslSerialNumberOfDataBits", "Bits8");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "BslSerialNumberOfStopBits", "Bits2");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "BslSerialParity", "Even");
CHECK(errRes);
/* Configure the camera's input signal */
errRes = PylonDeviceFeatureFromString(hdev, "BslSerialRxSource", "Line2");
CHECK(errRes);
/* Configure the camera's output signal */
errRes = PylonDeviceFeatureFromString(hdev, "LineSelector", "Line3");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "LineSource", "SerialTx");
CHECK(errRes);
/* Now, you must implement a suitable communication protocol. */
/* Camera parameters that help you implement the protocol are listed */
/* in the "Transmitting and Receiving Data" section above. */
# Configure serial communication
# Example: 19200 Baud, 8 data bits, 2 stop bits, even parity
camera.BslSerialBaudRate.Value = "Baud19200"
camera.BslSerialNumberOfDataBits.Value = "Bits8"
camera.BslSerialNumberOfStopBits.Value = "Bits2"
camera.BslSerialParity.Value = "Even"
# Configure the camera's input signal
camera.BslSerialRxSource.Value = "Line2"
# Configure the camera's output signal
camera.LineSelector.Value = "Line3"
camera.LineSource.Value = "SerialTx"
# Now, you must implement a suitable communication protocol.
# Camera parameters that help you implement the protocol are listed
# in the "Transmitting and Receiving Data" section above.

pylon Viewerを使用して、パラメーターを簡単に設定することもできます。