массив в последовательный порт

Я хочу отправить массив int на другой Arduino по последовательному порту.

Чтобы гарантировать лучшую надежность во время передачи, я добавил < и > с помощью endMarker и startMarker.

Получатель ждет, пока откроется серийный номер оборудования, и считывает данные из серийного номера программного обеспечения отправителя.

Код отправителя:

int test[] = {1, 2, 3, 4, 5, 6, 7};

void setup() {
  Serial.begin(9600); //
}

void loop() {
  for (byte i = 0; i < 7; i++) {
    Serial.write("<");
    Serial.write(test[i]);
    Serial.write(">");
    delay(500);
  }
}

Код для читателя, я отредактировал код отсюда: http://forum.arduino.cc/index .php?topic=396450

// Пример 3 — получение с начальным и конечным маркерами

include <SoftwareSerial.h>

const byte numChars = 32;
char receivedChars[numChars];

boolean newData = false;

SoftwareSerial mySerial(10, 11); // RX, TX Серийный номер программного обеспечения

void setup() {
    Serial.begin(9600);
    mySerial.begin(9600);
    Serial.println("<Arduino is ready>");
}

void loop() {
    recvWithStartEndMarkers();
    showNewData();
}

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char rc;

    while (Serial.available() > 0 && newData == false) {
        rc = mySerial.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // завершаем строку
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}

void showNewData() {
    if (newData == true) {
        Serial.print("This just in ... ");
        Serial.println(receivedChars);
        newData = false;
    }
}

Я не знаю, заключается ли проблема в файле Serial.write, который отправляет байты, или мне нужно использовать Serial.print для отправки строки.

, 👍0


1 ответ


1

Вы пытаетесь использовать 8-битный двоичный протокол для передачи 16-битных значений, а затем заключаете его в символы ASCII. Есть:

  • Нет возможности отличить символы ASCII от 8-битных двоичных данных, и
  • Невозможно уместить 16 бит в 8-битный протокол.

Самый простой способ — использовать Serial.print для преобразования всего протокола в ASCII:

Serial.print("<");
for (byte i = 0; i < 7; i++) {
  Serial.print(test[i]);
  if (i < 6) {
    Serial.print(",");
  }
}
Serial.println(">");

Что будет отправлено:

<1,2,3,4,5,6,7>
,

Спасибо, Majenko, могу ли я использовать пример 5 (http://forum.arduino.cc/index.php?topic=396450), чтобы прочитать этот вывод с помощью другого Arduino?, @MarkCalaway

Конечно, вы можете использовать его вариацию., @Majenko