Некорректный приём данных UART
- Войдите на сайт для отправки комментариев
Втр, 21/03/2017 - 01:33
Всем привет!
Гугл не помог, самому не догнать, нужна помощь)
Отправляю строку с одной ардуины на другую. На второй, которая принимает, для теста залито:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 3); // RX, TX
String s;
void setup() {
s = "";
mySerial.begin(19200);
pinMode(13, OUTPUT);
mySerial.println("Test");
}
void loop() {
while (mySerial.available() > 0) {
s+=mySerial.write(mySerial.read());
}
}
Первая трудится с таким кодом:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 2); // RX, TX
void setup()
{
Serial.begin(38400);
mySerial.begin(19200);
}
void loop()
{
if (Serial.available()){
mySerial.write(Serial.read());
}
}
При подключении первой к USB-COM, в терминале всё отображается корректно, а если USB-COM подключить к ардуике №2, то на выходе получаем мусор. Что ещё замечено интересного, первый символ всегда приходит верный.
ЗЫ: Ардуина №1 - Mega328 8mHz External 3v3 (pro)
Ардуина №2 - Mega328 16mHz External 5v (nano)
Уровни согласованы, скорости проверены, идей больше нет...
Кнопку редактировать не обнаружил, в первом коде ляп.
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 3); // RX, TX void setup() { mySerial.begin(19200); pinMode(13, OUTPUT); mySerial.println("Test"); } void loop() { while (mySerial.available() > 0) { mySerial.write(mySerial.read()); } }Столкнулся с подобной проблемой - работаю с gprs модулем Neoway M590, напрямую через UART to USB переходник, через тот же ком монитор ардуины иде - все работает, модем отвечает корректно. Подключил к Arduino Nano 328, ее код 2 строки (если что, я только учусь):
с короткими строками все работает отлично, а вот при отправке длинной строки появляются какие-то непонятьные символы. На скрине при отправке всей строки "AT+CGDCONT=1,"IP","internet.tele2.ru"" кодировка сбивается, а вот если отправить часть "AT+CGDCONT=1,"IP","intern", то все опять в порядке. Уже пробывал сначала считывать в переменную, потом выводить в порт, все так же работает. Особенность в том, что модем строку воспринимает корректно (на что отвечает ОК), а вот этот сбой происходит на стадии считывания програмного ком порта и передачи в аппаратный.
Мне по сути нуже ретранслятор с програмного порта на аппаратный, для контроля того что творится с модемом. Вроде задачка и простая, но мне оказалась не по силам. Может кто сталкивался?
Пришлось вместо write использовать print, но результат оказался тот же:
Спасибо за отзыв)
Кнопку редактировать не обнаружил, в первом коде ляп.
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 3); // RX, TX void setup() { mySerial.begin(19200); pinMode(13, OUTPUT); mySerial.println("Test"); } void loop() { while (mySerial.available() > 0) { mySerial.write(mySerial.read()); } }Я могу ошибаться, но мне кажется вот в чем дело. Возможно вы все перепутали и на не те ножки посылаете информацию с первой платы на вторую. Сделайте везде скорость одинаковую (и на компьютере тоже), ну, например, 19200.
1. Приведите схему включения.
2. Если предположить, что со схемой все в порядке, Вы уверены, что "скорости проверены"? У меня был случай, когда при передаче даже коротких сообщений (2-3 байта) наблюдались ошибки из-за того, что кварц на Ардуине (или керамический резонатор) имел частоту на 0.7% ниже номинала. Исправил пропорциональным увеличением заявленной скорости порта.
Спасибо всем за отклики.
Помог вариант с readString. Строка считывается корректно. Если читать по одному байту (read), то по прежнему на выходе не понятно что.
if (mySerial.available()>0){ SerialString=mySerial.readStringUntil('#'); mySerial.println(SerialString); FixString(); } if (SerialString!="") ReadDataFromString();Единственное, что не нравится, теперь приходится тратить больше времени на поиск начала строки, раньше я поверял каждый байт на соответствие символу начала строки, сейчас приходится считывать всю строку, и потом, в отдельной функции искать символ начала и приводить её к нужному виду
Решил проблему с работой Neoway M590 по UART (Serial) через Arduino - оказалось строка просто не успевала попасть в порт целиком. Пара задержек и все работает стабильно:
delay(20);//выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана if(SoftSerial.available() > 0){Serial.write(SoftSerial.read());} delay(20);//выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана if(Serial.available() > 0){SoftSerial.write(Serial.read());}Приветствую. Подскажите, куда копать. Есть код из примера:
#include <SoftwareSerial.h> SoftwareSerial mySerial(11, 12); // RX, TX void setup() { // Open serial communications and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println("Goodnight moon!"); // set the data rate for the SoftwareSerial port mySerial.begin(115200); mySerial.println("Hello, world?"); } void loop() // run over and over { if (mySerial.available() > 0) { Serial.write(mySerial.read()); } if (Serial.available() > 0) { mySerial.write(Serial.read()); } }К mySerial подключена внешняя (bluetooth) приблуда, которая выдает текст латиницей. Вот, что выдается в монитор IDE. Не важно, к стати, это ардуиновский монитор порта или какой то другой.
На команды, отправляемые из Serial, приблуда реагирует. Это как раз вывод ответов на эти команды.
Если приблуду присоединить непосредственно к порту компьютера и воспользоваться монитором порта, то вывод такой
Вышеперечисленные решения никак не помогли. Спасибо.
Приветствую. Подскажите, куда копать.
А на 9600 не пробовали?
Приблуда работает на 115200. И пока не нашел, как можно изменить.
Приблуда работает на 115200
Ну тогда приблуду посадить на аппаратный UART, а с компьютером общаться софтовым на 9600