Неправильные данные, полученные при последовательной связи
У меня есть две Arduino UNO, соединенные двумя проводами и землей, которые обмениваются информацией через последовательные данные. Связь работает с INT, но у меня возникают проблемы с получением правильных символов. Вместо символов я получаю только числа.
Я перепробовал все возможные комбинации Serial.write()
или Serial.println()
с HEX и ASCII, но это не сработало.
Я не знаю, что я делаю неправильно, если кто-нибудь может мне помочь, я буду признателен.
Передатчик:
#include <SoftwareSerial.h>
#define TX 2
#define RX 3
#define ask 3
#define ER_LED 12
String dataline = "605030";
const byte code = 60;
SoftwareSerial syserial(RX, TX); // прием, передача
void setup() {
// поместите сюда код установки для однократного запуска:
syserial.begin(57600);
Serial.begin(57600);
}
void loop() {
// поместите сюда ваш основной код для многократного запуска:
//syserial.println(dataline); //НЕТ
//syserial.println(28, DEC); // хорошо для чисел
Serial.println(dataline.length());
for (int i = 0; i < dataline.length(); i++)
{
syserial.print((char)dataline[i]);
}
syserial.println();
//syserial.write(234);
//syserial.print('<');
delay(4000);
}
Получатель:
#include <SoftwareSerial.h>
#define TX 2
#define RX 3
const byte ask = 3;
bool com_end;
#define ER_LED 7
#define AC_LED 5
SoftwareSerial syserial(RX, TX); // прием, передача
void setup() {
// поместите сюда код установки для однократного запуска:
syserial.begin(57600);
Serial.begin(57600);
}
void loop() {
// поместите сюда ваш основной код для многократного запуска:
while (syserial.available())
{
Serial.println(syserial.read());
}
delay(100);
}
Последовательный монитор на какой-нибудь б/с:
21:19:36.408 -> 253
21:19:36.408 -> 255
21:19:40.421 -> 253
21:19:40.421 -> 255
21:19:44.495 -> 253
21:19:44.495 -> 255
Монитор с SySerial на скорости 57 600 бит/с:
21:23:29.317 -> 241
21:23:33.308 -> 241
21:23:37.338 -> 241
21:23:41.328 -> 241
Мониторинг с помощью SySerial на скорости 300 бит/с:
21:27:03.444 -> 255
21:27:07.731 -> 255
21:27:12.095 -> 255
21:27:16.335 -> 255
21:27:20.635 -> 255
Обновление:
Я изменил контакты на UNO (TX -> 2) (RX -> 3), и теперь я снова получаю другие номера. Должно быть, я делаю что-то плохое, но не могу понять что.
@BruceWawe, 👍1
Обсуждение1 ответ
Лучший ответ:
Связь работает с INT, но у меня возникают проблемы с получением правильных символов. Вместо символов я получаю только числа.
Предлагаю вам сделать шаг назад, потому что ваш код не был обновлен в соответствии с тем, что вы указали в последующих комментариях, и быстро становится менее понятно, что происходит.
На каждом UNO используйте контакты 2,3 и GND. Не подключайте ничего другого к UNO.
UNO ONE контакт 2 соединяется с UNO TWO контакт 3
UNO ОДИН контакт 3 соединяется с UNO ДВА контакта 2
UNO ONE GND на UNO TWO GND
на UNO ONE запустите этот код:
// ПОЛУЧАТЕЛЬ
#include <SoftwareSerial.h>
SoftwareSerial SSerial(2,3); // прием, передача
void setup() {
Serial.begin(9600); // Аппаратное обеспечение монитора Arduino Serial
SSerial.begin(9600);
}
void loop() {
// отображать все, что приходит по серийному номеру программного обеспечения, на монитор Arduino (последовательный аппаратный)
if (SSerial.available()) {
Serial.write(SSerial.read());
}
}
на UNO TWO запустите этот код
// ОТПРАВИТЕЛЬ
#include <SoftwareSerial.h>
SoftwareSerial SSerial(2, 3); // прием, передача
void setup() {
SSerial.begin(9600);
}
void loop() {
SSerial.println("Simple Arduino SoftwareSerial Test");
delay(1000);
}
Откройте последовательный монитор на UNO ONE, и вы увидите "Simple Arduino SoftwareSerial Test" печатается каждую секунду.
Если вы не можете зайти так далеко, у вас другая проблема.
Вы используете два UNO на двух разных компьютерах? Вы используете два UNO на одном компьютере, то есть; запуск двух экземпляров IDE (может зависеть от ОС - я постоянно так делаю на Win 7, но не знаю о других ОС)?
Посмотрите, сможете ли вы сделать это первым, и я думаю, что будет легче исправить остальное.
Спасибо за ответ, настройка, которую вы дали, похоже, работает, я попытаюсь понять, что было не так в моем предыдущем коде..., @BruceWawe
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- myserial.available() возвращает нулевой байт
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- SoftwareSerial данные недоступны
Я получаю разные числа вместо символов, @BruceWawe
пожалуйста, откройте содержимое окна серийного монитора и вставьте его в свой пост... отформатируйте как код... пожалуйста, **без** картинок, @jsotola
Да, но они не отображаются как персонажи, @BruceWawe
Какие числа вы получаете при скорости 9600 бит/с?, @Edgar Bonet
Обновлен код с выводом на монитор, @BruceWawe
Контакты 0 и 1 на Uno предназначены для серийного номера HW. Возможно, если вы использовали контакты 3 и 4 для software serial, он может работать как задумано., @VE7JRO
Поменял, не работает. у меня были контакты 2 и 3, @BruceWawe
Меняешь провода? т.е. RX на одном Uno для TX на другом. Попробуйте использовать более низкую скорость передачи данных для software serial, 57600, вероятно, подталкивает ее., @Nick Gammon
Привет, спасибо за ваш ответ. Замена проводов ничего не дает на мониторе, поэтому я думаю, что провода в правильном положении. Я пытался использовать как «300 бит/с», так и «9600 бит/с» для «syserial», но он меняет только несколько чисел (_52 для 300 бит/с, дает 53 для 9600 бит/с_). Кажется, что числа меняются, когда я использую разные скорости передачи данных, @BruceWawe
У вас нет под рукой осциллографа или логического анализатора, чтобы _измерять_, а не _угадывать_?, @the busybee
@the busybee У меня нет ни осциллографов, ни логических анализаторов. Я бы попробовал с ними, если бы мог., @BruceWawe
Хорошо, тогда перепроверьте каждый компонент SW/HW и делайте маленькие шаги: например, проверяйте с помощью локальной петли, что у вас есть правильные контакты и программное обеспечение, передавайте отдельные байты четких шаблонов (от 0x01 до 0x80) с достаточным интервалом. , и так далее. Всегда довольно сложно заниматься разработкой без соответствующих инструментов., @the busybee
Что вы имеете в виду под каждым компонентом "SW/HW""? На данный момент я проверял соответствие пинов, пробовал использовать разные пины и пробовал стандартные коды, которые смог найти в сети, но пока безрезультатно..., @BruceWawe
Правильно, пины, которые вы используете, функции, которые вы вызываете, параметры этих функций. Вы пробовали предложения? Пожалуйста, добавьте новую информацию к вашему вопросу, [изменив] его., @the busybee
Вместо этого я бы попробовал использовать аппаратные последовательные порты. И да: приемник может использовать аппаратный порт как для приема от другого Arduino, так и для отправки на последовательный монитор., @Edgar Bonet