Странная работа Serial.available()...
- Войдите на сайт для отправки комментариев
Пишу процедуру начальной синхронизации с микроконтроллером (МК). Обмен по uart на скорости 9600. Ардуино UNO R3 (на CH340G) + LCD Keypad Shield.
По даташиту на МК нужно выдать ему в порт (от Ардуино) 512 байт 0х00 и тут же проверить от него (МК) отклик из трёх байт - 0x0d, 0x0a, 0x3e (именно в такой последовательности). Получение этих трёх байт - удачная синхронизация.
Получился вот такой код. Тут даже не проверяю пришедшие байты на правильность, а просто проверяю на количество принятых байт.
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!" / "Success!") while (Serial.available()) Serial.read(); //очищает Rx-буфер UART'а перед работой for (int i = 0; i < 512; i++) { Serial.write(0); //выдали в порт 512 байт 0х00 } Serial.flush(); //ждём окончания передачи из буфера int n = Serial.available(); if (n == 3) { lcd.print("Success!"); } else { lcd.print("Failed!"); } }
Не заработало. :) Начал разбираться. Вставил отладку - печать переменной "n" (возврат количества байт в Rx-буфере). Так оно там скачет 3, 5, 7, 9, 11 (эти наиболее частые значения (dec)). Попадаются даже 17 и более.
Подключил МК к терминалке на ПЦ. Настроил скорость 9600. Скриптом выдаю в порт 512 нулей. В окне приёма даже до окончания цикла (это правильно) появляются заветные ТРИ байта - 0x0d, 0x0a, 0x3e. Только три и ничего более! Т.е. МК выдаёт всё правильно - только три байта.
Добавил ещё отладку в код - печать всех байтов (что вернула Serial.available()) в Rx-буфере. Так вот первые три байта там всегда правильные - 0x0d, 0x0a, 0x3e, а потом идут какие-то повторяющиеся байты (к сожалению забыл их записать). И это точно не ответ от МК.
В общем, непонятки какие-то. Может разъясните?
Надо чуть-чуть подождать, прежде чем проверять наличие ответа.
Надо чуть-чуть подождать, прежде чем проверять наличие ответа.
Вот тут вставить задержку?
Где и сколько именно? От заданной скорости uart эта задержка тоже будет меняться?
И вообще, лучше бы код целиком видеть.
Так это ж была отладка...
Вот тут выводил на печать.
Попробуйте завершить отправку строкой: Serial.write("\r\n");
Попробуйте завершить отправку строкой: Serial.write("\r\n");
Этого делать нельзя. МК ожидает байты синхронизации только 0х00.
Ну, значит нельзя.