Мусор в первом принятом байте через UART ESP8266 Nodemcu

Tacho

New member
Делаю свап UART0 На GPIO13\15 в arduino, на осциллографе вижу, что приходят 10 нулей, например, но вместо первого байта в строковом массиве всегда мусор, serial.flush, очистка массива, предварительное чтение не помогают, от скорости не зависит. Опрашиваю serial.read через Serialevent запускаемый из loop, скетч больше ничего не делает. Результат вижу через обратный свап и выдачу в COM port или через Blynk в другом скетче уже без свапа. Данные приходят раз в 5 сек. Может кто сталкивался, куда копнуть? Или как-то по другому опрашивать, может пока отработают loop+serialevent байт и пропадает, но вроде в есп буфер есть?
 

CodeNameHawk

Moderator
Команда форума
Ошибка скорее всего в строке N...
Отладить это все быстрее, чем пост написать.
 

vidok

Member
serial.flush - вроде сейчас выполняет другую функцию. Не видя код трудно придумать возможную проблему. Что то подобное когда то было у меня (повторяю похожее), помогла небольшая задержка между приемами байтов (ну у меня так было , сразу говорю я далеко не спец). Хотя возможно я не понял проблему-тоды не обращайте внимание на данную инсинуацию.
 

Tacho

New member
serial.flush - вроде сейчас выполняет другую функцию. Не видя код трудно придумать возможную проблему. Что то подобное когда то было у меня (повторяю похожее), помогла небольшая задержка между приемами байтов (ну у меня так было , сразу говорю я далеко не спец)
Код без фокусов:
char inChar = (char)Serial.read();
inputString += inChar;
inCharCnt++; //cчетчик символов, обнуляю в loop после обработки строки
if (inCharCnt >= inCharMax)
stringComplete = true; //строка получена
 

CodeNameHawk

Moderator
Команда форума
Я вижу, только то что вы показали.
Займитесь отладкой.
Самая простая, в цикле принимаете символы по одному и выводите во второй сериaл.
Смотрите при помощи HTerm, он показывает и непечатные символы, а и да и нам покажите, скриншотами.
 
Последнее редактирование:

vidok

Member
может замена flush после приема блока данных в виде while(Serial.available()){ Serial.read(); delay(2);} ...
может действительно приходит за раз > inCharMax ...
может сделать флаг конца данных.
C++:
String incomBuf;
..............
bool SRead(){
    static String copyBuf=""; incomBuf=""; 
    while(Serial.available())
    {char ch = Serial.read();
        if(ch == '\r') {continue;}
        if(ch == '\n' && copyBuf!="") {copyBuf.trim(); incomBuf = copyBuf; copyBuf=""; return true; }
        else {copyBuf += ch;}}
}

void loop(){
if ( SRead()) { обработка incomBuf }
}
вот образец кода который я использую для чтения сериал (от сим800 и тд) у меня работает без проблем.Может чем то поможет

хотя может и аппаратная проблема.
 

Tacho

New member
С таким кодом, хоть убейся, первый байт FF, потом, что должно быть, наверно, в двух свопах проблема. Если накопить и потом напечатать, то только перед первым пакетом FF, между следующими нет:
Serial.swap();
//serial.read(); не помогает убрать FF
void loop()
{
if (Serial.available())
serialEvent();
if (stringComplete)
{
Serial.swap();
Serial.print(buff[0]);
delay(10); // Wait for printing
Serial.swap();
inCharCnt=0;
stringComplete = false;
}
}
void serialEvent() {
while(Serial.available())
{
buff[inCharCnt++] = (char)Serial.read();

if (buff[inCharCnt-1] ==0x2d) // Last char
{
stringComplete = true;
}
}
}
 

Tacho

New member
Вот такой костыль убрал проблему, задержка плюс 2 холостых чтения:
if (stringComplete) {
Serial.swap();
for(int i=0;i<inCharCnt;i++)
Serial.print(buff);
delay(20);
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Serial.swap();
delay(200); // Wait
Serial.read();
Serial.read();
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
inCharCnt=0;

stringComplete = false;
}
 

CodeNameHawk

Moderator
Команда форума
По идее задержка delay(500); должна быть после каждого Serial.swap();

Если скорость не большая, то можно попробовать и SoftwareSerial.
 

CodeNameHawk

Moderator
Команда форума
Неплохо бы узнать, не сохраняет ли есп конфигурацию во флеш, после каждого swap, а то может и дыру в еппромке сделать.
 

Tacho

New member
После другого свапа вставлял задержку - безрезультатно. Если бы в еепром сохранял, то при каждом ресете менялся бы на противоположный.
 
Сверху Снизу