Непонятный глюк с Serial.available()
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2016 - 07:50
Привет всем! Делаю контроллер для 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. И я не могу понять как это решить. Может, кто-то с этим сталкивался или я ошибся в коде?
Ну, это довольно естественное поведение. Вы читаете очень часто (пока ничего не пришло, Вы читаете loop'ом без всяких задержек и часто (не обязательно) Ваш available в первый раз срабатывает когда один байт уже пришёл, а остальные - ещё нет. Это нормально.
Вам что нужно-то? Не обрабатывать пока не придёт пакет из четырёх байтов? Если так, то и не обрабатывайте. Накапливайте в буффере пока не придёт полный пакет, а потом уже начинайте обработку.
Тогда понятно. Я думал, Serial.available() возвращает свое значение только когда был получен последний байт. Спасибо Вам за разъяснение.
А Вы подумайте просто, откуда ему знать последний получен или там ещё есть?
А Вы подумайте просто, откуда ему знать последний получен или там ещё есть?
if
(availableBytes == 4)