Arduino serial теряет данные
- Войдите на сайт для отправки комментариев
Всем привет. Прошу помощи, чтобы разобраться в проблеме. Хочу сконструировать цветомузыку, которая будет управляться с компьютера. Написал программу для компьютера, которая перехватывает звук с пк, анализирует и отправляет данные по ком порту. Пример отправляемой строки "C10,128,100,255;", где C - команда, 10 - номер светодиода, а дальше значение цвета rgb. На стороне ардуины написал код, который принимает эти данные. В setup указал:
Serial.begin(115200);
В loop сделал так:
void loop() { // Если пришли данные if (Serial.available() > 0) { // считаем //strcpy(portStr, Serial.readStringUntil(';').c_str()); char portStr[128]; // буфер для приёма данных с порта` Serial.readBytesUntil(';', portStr, 128); if (strlen(portStr) > 0) { switch(portStr[0]) // по первому символу определяем команду { case 'C': // пример команды "C1,25,100,255;" changeColor(portStr); break; } } } }
И реализовал саму функцию зажигания светодиода
void changeColor(char* portStr) { int i = 0,r = 0,g = 0,b = 0; int cnt = maxLedsNum/ledsNum; // просчитаем с каким шагом зажигать светодиоды (на случай, если их менее 64) sscanf(portStr, "C%02d,%03d,%03d,%03d", &i, &r, &g, &b); Serial.println((String) "" + (i/cnt) + " " + r + " " + g + " " + b); ledsP[i/cnt] = CRGB(r,g,b); if (i == 0) digitalWrite(LED_BUILTIN, (r == 0 & g == 0 & b == 0) ? LOW : HIGH); FastLED.show(); }
Но ардуино не успевает обрабатывать данные, даже если руками через терминал посылать быстро строку, то ардуино стопорится и не реагирует, если делать с небольшой паузой (примерно 1 секунду), то ардуино нормально работает. Как можно ускорить процесс обработки данных с порта?
Этот кусок кода просто дублирует первый светодиод на дебаговый светодиод
Ты уверен, что строка 14 работает как задумано? "&" это битовая операция, не логическая.
Там нужно && поставить?
Вообще работает как надо этот кусок
Там нужно && поставить?
В данном случае - пофиг.
В данном случае - пофиг.
Соглашусь.
Но ардуино не успевает обрабатывать данные, даже если руками через терминал посылать быстро строку, то ардуино стопорится и не реагирует, если делать с небольшой паузой (примерно 1 секунду), то ардуино нормально работает. Как можно ускорить процесс обработки данных с порта?
Если правда не успевает, то есть много путей, которые можно использовать (или все сразу)
Звучит всё интересно. Попробую
Но ардуино не успевает обрабатывать данные, даже если руками через терминал посылать быстро строку, то ардуино стопорится и не реагирует, если делать с небольшой паузой (примерно 1 секунду), то ардуино нормально работает. Как можно ускорить процесс обработки данных с порта?
Если правда не успевает, то есть много путей, которые можно использовать (или все сразу)
Даже если отправлять данные только для одного светодиода и закоментить FastLED.show();, ардуино всё равно перестаёт реагировать на команды при постоянной быстрой отправки данных
Даже если отправлять данные только для одного светодиода и закоментить FastLED.show();, ардуино всё равно перестаёт реагировать на команды при постоянной быстрой отправки данных
так оно и понятно, в команде readbytesUntil() есть скрытый таймаут 1 секунда, вот все и зависает.
Если хотите быстрой обработки - не используйте подобные команды, напишите сами чтение байт из порта, пока не встретится ";"
Ну, во-первых, ключевой фразой в моём сообщении было "Если правда не успевает" - в коде я не разбирался, я только сказал как можно ускорить.
А во-вторых, а чего Вы хотели? PC быстрее ардуины в 180 раз (поделите 3ГГц на 16МГц)! Понятное дело, что если гнать без задержек, то там всё переполнится. На этот случай был п. №3 в моей рекомендации.
Даже если отправлять данные только для одного светодиода и закоментить FastLED.show();, ардуино всё равно перестаёт реагировать на команды при постоянной быстрой отправки данных
так оно и понятно, в команде readbytesUntil() есть скрытый таймаут 1 секунда, вот все и зависает.
Если хотите быстрой обработки - не используйте подобные команды, напишите сами чтение байт из порта, пока не встретится ";"
переписал получение данных с порта. Всё побежало, тормоза исчезли
Логично было бы выложить итоговый код