Непонятный глюк с Serial.available()

tmp64
tmp64 аватар
Offline
Зарегистрирован: 19.09.2016

Привет всем! Делаю контроллер для RGB светодиодной ленты с управлением с ПК через USB. При отладке C# программы, столкнулся с непонятным глюком. Если отправить некоторую последовательность байтов (FF 01 FF 01, например), то Serial.available() вернет 1, а потом, после следующего read(), вернет 3.

Я написал тестовый код:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  int availableBytes = Serial.available();
  
  if (availableBytes > 0)
  {
    byte rxData[availableBytes];
    Serial.readBytes(rxData, availableBytes);

    if (rxData[0] == 0xff)
    {
      Serial.write(0x0f);
      return;
    }

    Serial.write(rxData, availableBytes);

    delay(2000);
  }
}

Если отправить FF 01 FF 01, то Arduino отправит FF, а затем 01 FF 01. И я не могу понять как это решить. Может, кто-то с этим сталкивался или я ошибся в коде?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, это довольно естественное поведение. Вы читаете очень часто (пока ничего не пришло, Вы читаете loop'ом без всяких задержек и часто (не обязательно) Ваш available в первый раз срабатывает когда один байт уже пришёл, а остальные - ещё нет. Это нормально.

Вам что нужно-то? Не обрабатывать пока не придёт пакет из четырёх байтов? Если так, то и не обрабатывайте. Накапливайте в буффере пока не придёт полный пакет, а потом уже начинайте обработку.

tmp64
tmp64 аватар
Offline
Зарегистрирован: 19.09.2016

Тогда понятно. Я думал, Serial.available() возвращает свое значение только когда был получен последний байт. Спасибо Вам за разъяснение.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А Вы подумайте просто, откуда ему знать последний получен или там ещё есть? 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ЕвгенийП пишет:

А Вы подумайте просто, откуда ему знать последний получен или там ещё есть? 

if (availableBytes == 4)