Всем привет! Передаю на ардуину строку с esp, строка отправляется раз в 1 секунду, это время с ntp Код (C++): sendd = "111." + String(hour)+ "." + String(minute) + "." + String(second) + "." + String(day) + "." + String(month) + "." + String(year) + ".222"; Serial.print(sendd); В монитор порта esp пишется как и задумано. Пытаюсь принять это на ардуино мега в 3 сериал, и вывести в первый. Но не выходит. Код приема такой: Код (C++): while (Serial3.available()) { char temp=Serial3.read(); if (temp>' ') { c = temp -'0'; data +=c; } //send = true; } Serial.print(data); data = " "; Serial3.flush(); /*if(send) { Serial.println(data); data = " "; send = false; }*/ Вот что в мониторе порта Куда копать?
Или парсить самостоятельно. В теме про дисплей Некстион посмотрите пример приема данных от него. Или про подсчет crc8 - там тоже парсятся данные. Это я только навскидку про свои темы говорю. Здесь еще сотня таких Вообще, с нового года гугл работает хорошо на слово "парсинг данных".
Ну как сказать. Мне кажется самый простой вариант когда кто то сделает это за вас))) А так вариантов много и с каждым из них нужно разбираться что бы понять как он работает...
Зачем лишние преобразования, не пойму? Код (C++): String data; while (Serial3.available()) { char temp=Serial3.read(); data += temp; } Serial.print(data); data = " "; И всё.
Сделал так. Шлю с есп по сериалу такую строку а12b25c36d.... Разбираю на ардуине так: Код (C++): while ((Serial3.available() > 0)) { if ((char(Serial3.read())) == 'a') { t1 = Serial3.parseInt(); } if ((char(Serial3.read())) == 'b') { t2 = Serial3.parseInt(); } if ((char(Serial3.read())) == 'c') { t3 = Serial3.parseInt(); } } Работает, но иногда данные сбиваются. Как повысить работоспособность?
Таки не понятно, что конкретно вы хотите сделать со строкой получаемую по сериалу? Просто принять и передать ее дальше, или же распарсить и достать из нее какие то данные, в каком формате? От этих исходников зависит и метод который нужно будет реализовать... А так простите можно гадать до следующего нового года...
Как уже заметил Unixon, Вам необходимо объединить метод чтения байта из порта с проверкой на его существование - даже если все три байта были посланы непосредственно друг за дружкой, то это совсем не означает, что все они сразу попадут в приемный буфер, о наличие информации в котором и сообщает метод available().
Serial.available() возвращает количество байт в буфере. Если длина сообщения заранее известна, проверяете условие типа if (Serial.available() >= MSG_LEN), но MAX_LEN не может быть больше кольцевого буфера UART. Если длина неизвестна, то (а) принимаете байты до тех пор пока не встретится байт, означающий конец сообщения, либо (б) в начале сообщения передаете его длину, а потом само сообщение.