Serial.flush() ... что не так ?

Тема в разделе "Arduino & Shields", создана пользователем NR55RU, 19 апр 2013.

  1. NR55RU

    NR55RU Гик

    Тут у меня возникло не большое затруднение.
    Вероятно я не совсем понимаю как должна работать эта функция но во к примеру код:
    Код (Text):
    void setup()
    {
      Serial.begin(9600);
    }
     
    void loop()
    {
      if(Serial.available() > 0)
      {
        delay(50);
        char c = Serial.read();
        Serial.println(c);
        Serial.flush();
      }
    }
    В итоге программа послушно выводит все символы один за одним, когда по идее, должна считать 1 символ а остальное скинуть.
    Что я только не делал, как только не игрался, никак не получается слить буфер.
    Использую UNO R3, софт Arduino 1.0.4
    Подскажите, может я что то не верно понимаю про буфер.
     
  2. Megakoteyka

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

  3. NR55RU

    NR55RU Гик

    Я это читал, только не совсем понял что именно имелось ввиду в этих строках. И имеют ли эти строки отношение к моему вопросу :)
     
  4. roggedhorse

    roggedhorse Гик

    В библиотеке Serial версии 022 функция flush сбрасывала все не отправленные данные, находящиеся на момент вызова в буфере отправки.

    В следующих версиях ее цель изменилась: ждать до тех пор, пока последний байт из выходного буфера не будет передан.


    Чтобы слить буфер, вам нужно определить новый метод в классе HardwareSerial.
    Можно залезть в стандартную библиотеку (это не сложно, но при переходе на следующую версию IDE может возникнуть путаница) или создать свой класс mySerial, например, путем наследования стандартного класса.
    Это не так сложно, как кажется
     
    Andrey12 и nailxx нравится это.
  5. mike_KH

    mike_KH Гик

    Скачайте старую версию IDE
     
  6. HighDigital

    HighDigital Гик

    в Arduino IDE - 0024 поддерживается и ниже
     
  7. nailxx

    nailxx Официальный Нерд Администратор

    Не стоит качать старую. Просто замените ваш

    Код (Text):

    Serial.flush();
     
    на:

    Код (Text):

    while (Serial.available())
        Serial.read();
     
     
    Sand, Megakoteyka и roggedhorse нравится это.
  8. HighDigital

    HighDigital Гик

    так тоже можно :)
    А почему его убрали? чем он мешал? :(
     
  9. nailxx

    nailxx Официальный Нерд Администратор

    Его не убрали, а изменили семантику (смысл). flush всю жизнь означал «расквитаться с очередями, отправить всё из буферов куда нужно», а не «забыть всё, что в буферах». Так `flush` имеет тот же смысл, что и в других библиотеках.
     
    Andrey12 и Megakoteyka нравится это.
  10. hibiki

    hibiki Гик

    скажем, у него было весьма нестандартное поведение, по сравнению с другими flush'ами :)
     
    Andrey12 нравится это.
  11. HighDigital

    HighDigital Гик

  12. Unixon

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

    Старый flush() можно переименовать в drop()
     
    Andrey12 нравится это.