1

そのため、VisualStudio と Arduino ベースのボードで C++/CLI を使用しています。私の目標は、RS485 経由で MODBUS を実装することです。

したがって、開発用のセットアップは次のとおりです...

FTDI USB-RS485インターフェースケーブルを介して、Arduinoシリアルポート「Serial1」に接続されたMaxim MAX3485チップに接続されたラップトップ。

Visual Studio で MODBUS プロトコルを作成し、Arduino に 5 つのレジスタ (5 バイト配列) の内容で応答するように要求してテストしています。何らかの理由を除いてすべてが機能します。結果を確認すると、戻りバイトが2つに分割されます。

IE.. Arduino から次のバイトを送信しています。

0 A 0 14 0 1E 0 28 0 32

A は実際には「0A」ですが、端末ウィンドウには「A」としか表示されません。コンピュータ上のソフトウェアがバイトを受け取り、それらを配列に格納します。次に、受信したバイトを画面にテキストとして表示します。私が得るものは次のとおりです。

0 A 0 1 4 0 1 E 0 2 8 0 3 2

「1と4」、「2と8」などの間のスペースを除いて、これは正しいように見えます。これは、送信した10バイトではなく14バイトであることを示しています。

画面に各バイトをスペースで区切って表示しています。別のCOMポートのターミナルウィンドウを使用して、送信されるバイトが正しくフォーマットされていることを確認しました。問題はバイトの読み取りにあるのでしょうか?

私のArduinoコード:

// Print to terminal window to verify bytes leaving
  Serial.print("Sending:-  "); 
  for (int x = 0; x < i_Index; x++) {

    Serial.print(DataTxRegister[x], HEX);
    Serial.print(" ");

  }
  Serial.println(" ");


  // CONFIGURE 485 CHIP TO TX MODE
  digitalWrite(CNTL_PIN, HIGH);
  delay(5);

  // TRANSMIT ALL DATA FROM TX REGISTER
  for (int x = 0; x < i_Index; x++) {

    Serial1.print(DataTxRegister[x], HEX);

  }

  i_Index = 0;
  delay(5);
  // CONFIGURE 485 CHIP BACK TO RX MODE
  digitalWrite(CNTL_PIN, LOW);

ビジュアル スタジオ コード

読み取りバイト....

int8_t Byte;
// DATA RECIEVED FROM ARDUINO / DEVICE USING MODBUS PROTOCOL
if(sender == this->serialPort1){

    Msg.Message_Length = 0;
    while (this->serialPort1->BytesToRead != 0) {

    Byte = this->serialPort1->ReadByte;         
    if (Byte != -1) {

        Msg.Incoming_Bytes[Msg.Message_Length++] = (Byte);
    }


    }

this->BeginInvoke(gcnew EventHandler(this, &Form1::DisplayMBRecieved));
}

表示バイト...

this->textBox1->AppendText("\r\n");
this->textBox1->AppendText("Bytes Received: ");
this->textBox1->AppendText(Convert::ToInt32(Msg.Message_Length).ToString("X8") + "  :-  ");

for (unsigned int i = 0; i < Msg.Message_Length; i++) {

    this->textBox1->AppendText(Convert::ToString(Convert::ToChar(Msg.Incoming_Bytes[i])));

    this->textBox1->AppendText(" ");

}

Msg.Message_Length = 0;
4

0 に答える 0