массив в последовательный порт
Я хочу отправить массив 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 для отправки строки.
@MarkCalaway, 👍0
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>
- Печать массива с помощью функции печати и последовательной записи в Arduino Uno
- Отправить массив 2d PROGMEM через SoftwareSerial
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
Спасибо, Majenko, могу ли я использовать пример 5 (http://forum.arduino.cc/index.php?topic=396450), чтобы прочитать этот вывод с помощью другого Arduino?, @MarkCalaway
Конечно, вы можете использовать его вариацию., @Majenko