因此,我正在 VisualStudio 中使用 C++/CLI 和基于 Arduino 的开发板。我的目标是通过 RS485 实现 MODBUS。
所以我的开发设置如下......
笔记本电脑通过 FTDI USB-RS485 接口电缆连接到连接到 Arduino 串行端口“Serial1”的 Maxim MAX3485 芯片。
我一直在 Visual Studio 中编写我的 MODBUS 协议,并通过要求 Arduino 响应 5 个寄存器(一个 5 字节数组)的内容来对其进行测试。除了某种原因,一切正常,当我检查结果时,返回字节被分成两部分。
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”等之间的空格。这告诉我我有 14 个字节而不是我发送的 10 个字节。
我在屏幕上显示每个字节,用空格分隔。我使用单独的 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;