Получение данных по UART
- Войдите на сайт для отправки комментариев
Втр, 12/09/2017 - 20:09
задача получать данные по UART ( уже предвижу восклицания "Ах какая редкость!" и "Да неужели?!". :)) )
Код я написал, и он работает.
void listen_uart(){
if(ss.available()>100){while(ss.available())ss.read();return;}
int i = 0;
byte buff;
do{
buff = ss.read();
}while(buff!=36);
delay(1);
do{
text[i++] = ss.read(); delay(1);
}while(text[i-1]!=42);
ss.read();ss.read();
for( int k = 0; k<(i-1); k++) {Serial.print((char)text[k]);Serial.print(" ");}
Serial.println();
ss.flush();
if (text[4]==67) parse_rmc();
if (text[4]==65) parse_gga();
}
Так вот если в 11 строке убрать delay(1); , то вместо нормальных данных порт начинает принимать всякую белеберду: правильные данные перемешаны с 'я'. Бодрейт 38400, если это имеет значение. И это не на первом девайсе у меня такое.
Собственно вопрос: в чем причина данного безобразия, и как красивее данный трабл решить?
Спасибо заранее! ;)
забыл сказать, использую SoftwareSerial .
Скорее всего, Вы пытаетесь читать байт, который ещё не пришёл или пришёл, но ещё не обработан и не положен в буфер, а delay решает проблему. Чтобы убедиться так это или нет, попробуйте убрать delфy из строки 11, а между строками 10 и 11 всуньте
while(!ss.available());
Если будет работать хорошо, значит так и есть.
Скорее всего, Вы пытаетесь читать байт, который ещё не пришёл или пришёл, но ещё не обработан и не положен в буфер, а delay решает проблему. Чтобы убедиться так это или нет, попробуйте убрать delфy из строки 11, а между строками 10 и 11 всуньте
while(!ss.available());
Если будет работать хорошо, значит так и есть.
Да, Вы правы, все так и есть. Только while(!ss.available()); я не стал применять, т.к. он требует , скорее всего, еще контроль таймаута. Ограничился delayMicroseconds(100); - вроде все работает ок.
Не, ну я же не имел в виду оставлять бесконечный цикл в продакшн - это был способ проверки. А Ваш delay - сами смотрите. Если программе нечем заняться пока не пришло всё, то и ладно, а если есть чем, то лучше получать данные по частям при разных проходах loop а параллельно заниматься чем-то ещё.