Как очистить буфер UART'a после связи

Тема в разделе "Arduino & Shields", создана пользователем Faberge, 7 июл 2015.

  1. Limoney

    Limoney Гик

    Дело в том, что Serial3.available() > 0 будет больше нуля, пока не будут прочитаны все полученные байты, поэтому получается смесь.
     
  2. Faberge

    Faberge Administrator Администратор

    Так ведь там if + for стоит. А для Serial3.available > 0 надо while ставить.
     
  3. Limoney

    Limoney Гик

    Sharles, так у Вас получилось?
     
  4. Faberge

    Faberge Administrator Администратор

    Нет, тут совсем все странно. Либо на ночь у меня башка совсем не варит. Расклад на сейчас примерно такой. Переписал эту часть как:
    Код (Text):
    delayMicroseconds(400);
      digitalWrite(RS485_MODE_PIN, LOW);
      delayMicroseconds(400);
     
      while (Serial3.available())
      {
        SerialUSB.println(Serial3.read());
      }
    Повесил функцию на нажатие и удержание кнопки и загорание светодиода. И теперь самое интересное.
    Нажимаю и держу кнопку - светодиод загорается, на серийник приходят ДВА пакета (вместо одного).
    Отпускаю кнопку - светодиод тухнет.
    Нажимаю второй раз и держу - светодиод загорается, на серийник не приходит НИЧЕГО.
    Отпускаю кнопку - светодиод тухнет.
    И так по кругу.
    Как так получается - я не знаю. Я прочитал весь даташит минимум три раза, там нигде не сказано, что пакет должен дублироваться. Но даже так, они бы приходили все равно каждый раз. А так я даже хз. Я явно что-то упускаю в работе буфера UART'а, но пока не понимаю что именно.
     
  5. Limoney

    Limoney Гик

    смотрите исходный код SoftwareSerial.cpp там пакет не дублируется, а просто смещается указатель(tail и head) буфера.
    Скорее свой корректив вносит SerialUSB.println
     
  6. Faberge

    Faberge Administrator Администратор

    Да нет, SerialUSB.println() работает нормально. Я кидаю в него одно число - он выводит одно число. Реально что-то другое должно быть. Я было грешным делом подумал, что баудрейт выставлен не так, но ведь я тогда вообще бы черт знает что получал. А так нет.
     
  7. Limoney

    Limoney Гик

    Хотел сказать, что при отправке данных SerialUSB.println()
    фун-я Serial3.read() читает байт и смещает указатель в буфере т.е на 1 байт меньше. Возможно фун-я SerialUSB.println пред тем как отправить бай заносит его в буфер и таким способом буфер не пустой.
    Не знаю, как работает SerialUSB.println.
     
  8. Unixon

    Unixon Оракул Модератор

    Почему бы не добавить в класс Stream метод clear() ?