Отловить символ через serial
- Войдите на сайт для отправки комментариев
Пнд, 28/03/2016 - 07:06
Не могу понять как считать данные из последовательного порта. Отправляю в порт запрос вида
blueToothSerial.print("0105");
Получаю ответ примерно такой:
41 05 7B
>
Символ ">" говорит о готовности принимать следующий запрос.
Скетч:
delay(200); blueToothSerial.flush(); blueToothSerial.print("0105"); // температура blueToothSerial.print("\r"); getResponse(); getResponse(); if ((strtol(&rxData[0],0,16)==65) and (strtol(&rxData[3],0,16)==5)) { tmp_var = strtol(&rxData[6],0,16)-40; } void getResponse(void){ char inChar=0; while(inChar != '\r'){ if(blueToothSerial.available() > 0){ if(blueToothSerial.peek() == '\r'){ inChar=blueToothSerial.read(); rxData[rxIndex]='\0'; rxIndex=0; } else { inChar = blueToothSerial.read(); rxData[rxIndex++]=inChar; } } } }
Если в функции getResponse использовать символ '\r', то все работает, но с задержкой ни меньше 200мс. Соответственно данные отображаются с торможением. Если вместо '\r' использовать '>' функция не работает. Если отловить этот символ в конце приема строки то задержка в самом начале не нужна будет.
Вывод: надо писать код без использования delay, и всё будет нормально. Отослал команду, и потом накапливаешь во внутренний буфер, пока не встретится \n (символ \r можно игнорировать). Как только встретился символ \n - анализируешь, что в буфере - и очищаешь его. При анализе смотришь - если в буфере строка ">" (не символ '>', а именно строка ">" - для простоты понимания будем считать, что для буфера используется переменная типа String) - значит, от модуля пришло приглашение на ввод данных - тогда и пишешь в порт что нужно.
Псевдокод:
Конечно, в нормальной реализации надо предусмотреть все состояния, для этого пишется конечный автомат, как вариант. Но для понимания того, как можно написать код без delay - думаю, достаточно. Ещё раз подчеркну - это псевдокод, я его не компилировал, не оптимизировал, не проверял на ошибки - это только один из принципов, не более того.