Arduino — Простой C ++ / CLI SerialPort ReadByte (по крайней мере, так я думал …)

Итак, я работаю с C ++ / CLI в VisualStudio и плате на основе Arduino. Моя цель — реализовать MODBUS через RS485.

Таким образом, у меня есть настройки для разработки следующим образом …

Ноутбук подключен через интерфейсный кабель FTDI USB-RS485 к чипу Maxim MAX3485, который подключен к последовательному порту Arduino «Serial1».

Я писал свой протокол MODBUS в Visual Studio и тестировал его, прося Arduino ответить содержимым 5 регистров (5-байтовый массив).
Все работает, за исключением какой-то причины, когда я проверяю результат, возвращаемые байты разделяются на две части.

Т.е. … я посылаю следующие байты из 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);

Код Visual Studio

Читайте байты ….

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;

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]