
Сообщение от
SoftWareGuy
Если в момент чтения available выдает всякую фигню, значит кто-то засирает входной буфер.
И только не МК на той стороне. С той стороны МК всегда отдаёт 3 байта (0d,0a,3e). Я это проверил в терминалке на ПЦ (подключил МК к ПЦ). Задал отправку 512 нулей в цикле на скорости 9600 и в другом окне (показывает, что принято от МК) через какое-то время (даже при незаконченном цикле 512-ти нулей) появляются три байта от МК - удачная синхронизация. И только ТРИ байта.
Потом я вставил отладку в твой код - вывод принятых байтов на дисплей.
Код:
int receivedByte = Serial.read(); // можно сохранить это где нибудь чтобы проверить значение
lcd.print(receivedByte);
Первые три принятых байта были правильными и в нужной последовательности - 0d,0a,3e.
Потом я увеличил количество ожидаемых байтов до 7-ми (ограничение дисплея и ленью возиться с переносом строки - всё делалось за 10 мин до конца рабочего дня).
Код:
NumBytesToReceive = 7; // количество байт которые ждем в ответ
И вот тут получилось занятно - после первых трёх правильных байтов, в буфере есть ещё данные, которые доступны для чтения! Там вместилось (до конца строки на дисплее) ещё две повторяющиеся последовательности байтов. К сожалению, я забыл их переписать, теперь только в понедельник. Но МК их 200% не передаёт! Это либо железо Ардуины (очень вряд ли, т.к. я писал тест loop-back'а и там всё принимается нормально.
Код:
void ECHO_RUN() { //тест UART'a на loop-back (коротим Rx-Tx)
Serial.end(); //для смены скорости сперва нужно закрыть!
Serial.begin(9600); //настроили скорость UART на 115200
lcd.clear();
while (Serial.available()) Serial.read(); //вот это работает - очищает буфер UART'перед работой!!!
lcd.setCursor(0, 0);
lcd.print("Transmit=");
lcd.setCursor(0, 1);
lcd.print("Receive =");
for (int i = 0; i <= 255; i++) {
Serial.write(i);
lcd.setCursor(9, 0);
lcd.print(i);
if (Serial.available()) { // Если в буфере есть данные
incomingByte = Serial.read();
lcd.setCursor(9, 1);
lcd.print(incomingByte);
}
delay(200);
}
ECHO_TEST();
}
Ещё в своей версии синхронизации, я тоже вставил отладку - печать переменной n, возвращаемой функцией int n = Serial.available();...
Код:
void SYNC_1986() { //функция синхронизации с 1986ВЕ91
Serial.end(); //для смены скорости сперва нужно закрыть!
Serial.begin(9600); //настроили скорость UART на 9600
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Try to Sync...");
lcd.setCursor(5, 1); //подготовим позицию для печати результата ("Failed!" / "Succes!")
while (Serial.available()) Serial.read(); //вот это работает - очищает буфер UART'перед работой!!!
for (int i = 0; i < 512; i++) {
Serial.write(0); //выдали в порт 512 байт 0х00
}
Serial.flush(); //ждём окончания передачи из буфера
int n = Serial.available();
lcd.setCursor(0, 1);
lcd.print(n); //вывод количества байт в буфере.
if (n == 3) {
lcd.setCursor(5, 1);
lcd.print("Succes!");
} else {
lcd.setCursor(5, 1);
lcd.print("Failed!");
delay(1000);
menu = 3; //опять вернулись к файлу прошивки
root = SD.open(name_folder + "/");
SD_card(root);
root.close();
}
}
Так вот в этом случае у меня почти рандомно выводились значения 3,5,7,9,11 (dec). Эти наиболее часто. Очень редко были 17 и ещё выше.
Т.е. всегда нечётное количество байт. Повторюсь: МК на той стороне всегда гарантированно отдаёт только 3 байта.