Получение данных по UART

5N62V
Offline
Зарегистрирован: 25.02.2016

задача получать данные по 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, если это имеет значение. И это не на первом девайсе у меня такое.

Собственно вопрос: в чем причина данного безобразия, и как красивее данный трабл решить?

Спасибо заранее! ;)

5N62V
Offline
Зарегистрирован: 25.02.2016

забыл сказать, использую SoftwareSerial . 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скорее всего, Вы пытаетесь читать байт, который ещё не пришёл или пришёл, но ещё не обработан и не положен в буфер, а delay решает проблему. Чтобы убедиться так это или нет, попробуйте убрать delфy из строки 11, а между строками 10 и 11 всуньте 

while(!ss.available());

Если будет работать хорошо, значит так и есть.

5N62V
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:

Скорее всего, Вы пытаетесь читать байт, который ещё не пришёл или пришёл, но ещё не обработан и не положен в буфер, а delay решает проблему. Чтобы убедиться так это или нет, попробуйте убрать delфy из строки 11, а между строками 10 и 11 всуньте 

while(!ss.available());

Если будет работать хорошо, значит так и есть.

Да, Вы правы, все так и есть. Только while(!ss.available()); я не стал применять, т.к. он требует , скорее всего, еще контроль таймаута. Ограничился delayMicroseconds(100); - вроде все работает ок.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не, ну я же не имел в виду оставлять бесконечный цикл в продакшн - это был способ проверки. А Ваш delay - сами смотрите. Если программе нечем заняться пока не пришло всё, то и ладно, а если есть чем, то лучше получать данные по частям при разных проходах loop а параллельно заниматься чем-то ещё.