Получение данных по 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 а параллельно заниматься чем-то ещё.