Не работает Serial.Flush();

Тема в разделе "Arduino & Shields", создана пользователем alexfox, 8 июл 2013.

  1. alexfox

    alexfox Нуб

    У меня Arduino mega 2560 r3, Arduino 1.0.5, пытался заменить Serial.Flush(); на
    while (Serial.available())
    Serial.read();
    , у меня ничего не вышло.
    Что делать?
     
  2. Unixon

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

    Serial.Flush(); = "не возвращайся, пока не отправишь все, что было послано"
    Serial.available()+Serial.read() = "читай, если есть, что читать"
     
    Tomasina и Mitrandir нравится это.
  3. alexfox

    alexfox Нуб

    Блин, наверное не так объяснил. Смотрел 6 урок по ардуино от Джереми Блюма и там чтобы не обрабатывалось сразу много символов он добавил Serial.Flush(); , но в программе arduino старше 1.0 Serial.Flush(); имеет другое значение и поэтому на форуме было написано что его можно заменить на
    while (Serial.available())
    Serial.read();
    но и в этот раз ничего не получилось.
     
  4. Mitrandir

    Mitrandir Гуру

    а что хотел получитьт и что получилось?
    конструкция
    while (Serial.available())
    Serial.read();

    сольет в никуда весь буффер ком порта
     
  5. Megakoteyka

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

    Выложите код, будем посмотреть)
     
  6. Programmer

    Programmer Нуб

    Мне помогло
    Код (C):
    while (Serial.read() > 0);
     
  7. Mitrandir

    Mitrandir Гуру

    Не совсем ИМХО верное решение. Так как если в порт придет последовательность байт: 25 36 0 45 63
    То этот код удалит все до первого 0 включительно, а остальное оставит. То есть удалит 25,36,0 а 45,63 останутся. Правильнее делать используя функцию available.
    Код (C):
    while(Serial.avaiable() || Serial.read());
     
  8. Megakoteyka

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

    Код (C):
    while(Serial.avaiable())
        Serial.read();
    Либо можно залезть в \hardware\arduino\cores\arduino\HardwareSerial.cpp и добавить функцию FlushRX, которая будет делать так:
    Код (C):
    rx_buffer->tail = rx_buffer->head;
    При этом будет выполняться всего одно присвоение переменной вместо цикла неизвестной длительности с вызовами функций, а результат будет тем же - буфер полностью опустошится.
     
  9. Unixon

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

    И чем только люди ни занимаются, лишь бы не писать нормальный парсер на конечном автомате...
     
  10. Megakoteyka

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

    А при чем тут парсер? Вроде речь шла о чистке буферов...
     
  11. Unixon

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

    А, да, точно. Это я темой промахнулся. :D
     
  12. bboykazbek

    bboykazbek Нуб

    //Program by Jeremy Blum
    //www.jeremyblum.com
    //Uses commands from computer to control arduino

    int ledPin = 13;

    void setup()
    {
    //Create Serial Object
    Serial.begin(9600);
    pinMode(ledPin, OUTPUT);
    }

    void loop()
    {
    //Have the arduino wait to receive input
    while (Serial.available() == 0);
    //Read the Input
    int val = Serial.read() - '0';
    if (val == 1)
    {
    Serial.println("Led is On");
    digitalWrite(ledPin, HIGH);
    }
    else if (val == 0)
    {
    Serial.println("Led is Off");
    digitalWrite(ledPin, LOW);
    }
    else
    {
    Serial.println("Invalid!");
    }
    Serial.flush(); // как же его менять??
    }
     
  13. fogary

    fogary Гик

    Методом опущения. Проще говоря, уберите или закомментируйте эту строку.
     
  14. bboykazbek

    bboykazbek Нуб

    What?!
     
  15. Fixloop

    Fixloop Нуб

    Я добавил функцию в HardwareSerial.cpp:
    void HardwareSerial::flushRX()
    {
    rx_buffer->tail = rx_buffer->head;
    }

    Добавил в HardwareSerial.h:
    ...
    public:
    inline HardwareSerial(
    volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
    volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
    volatile uint8_t *ucsrc, volatile uint8_t *udr);
    void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
    void begin(unsigned long, uint8_t);
    void end();
    void flushRX(void);
    ....
    И получил ошибку в оболочке Arduino:
    C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp: In member function 'void HardwareSerial::flushRX()':

    C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp:192:4: error: 'rx_buffer' was not declared in this scope

    rx_buffer->tail = rx_buffer->head;

    ^

    exit status 1
    Ошибка компиляции для платы Arduino/Genuino Uno.

    Подскажите что не так?
     
  16. Fixloop

    Fixloop Нуб


    Здравствуйте! В итоге как решена проблема с flush()?
     
  17. levey

    levey Нуб

    if (Serial.peek()) {
    Serial.end();
    delay(100); // время на очистку
    Serial.begin(9600);
    }
     
  18. Unixon

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

    Что у вас очищается во время delay() ? :)
     
  19. levey

    levey Нуб

    После команды Serial.end(); очищается буфер команд, на это необходимо время прежде чем открыть новое(по новой) соединение командой Serial.begin(9600); - так понятнее? ))))
     
  20. Unixon

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

    А буфер команд у вас где? Спрашиваю потому, что МК, на котором выполняется delay(), в это время просто вхолостую крутит циклы и ждет таймер.