Serial

fsdb
Offline
Зарегистрирован: 24.10.2015

Ребята добрый день.

Подскажите неучу как правильно читать данные одной ардуины с другой. подключено к 0 и 1 входам с обоих сторон и скорость 115200

ожидаемые значения число от 0 до 999

на первой ардуине я делаю 

Serial.println(x);

на второй ардуине я делаю:

while(Serial2.available()  ) {
byte c = Serial2.read(); 
if ((c!=10) and (c!=13)) {SerialBuff+=char(c); delay(2);}
if (c==13) { 
 
if (isNumeric(SerialBuff)) {
//если является числом
  micrometer=SerialBuff.toFloat();
}
}

ВОПРОС:  как принимать правильно что бы не потерять данные или не получить не корректный результат

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

fsdb пишет:

ВОПРОС:  как принимать правильно что бы не потерять данные или не получить не корректный результат

ОТВЕТ: никак. Протоколы бывают надежными (например, TCP) и ненадёжными (например UDP). UART - ненадёжный протокол.

Дополнение: никак в том смысле, что если нужен надёжный протокол, то его надо делать поверх UART, а не просто писать и читать.

b707
Offline
Зарегистрирован: 26.05.2017

fsdb пишет:

подключено к 0 и 1 входам с обоих сторон

на второй ардуине я делаю:

while(Serial2.available()  ) {

Если подключать к пинам 0 и 1 и читать при этом Serial2 - ничего не получится

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

fsdb пишет:

ВОПРОС:  как принимать правильно что бы не потерять данные или не получить не корректный результат

Только придумывать свой пакетный протокол с квитированием и формированием контрольной суммы пакета.  Причем, простое сложение по модулю тут не катит

fsdb
Offline
Зарегистрирован: 24.10.2015

спасибо ребята за грамотный ответ.

пожалуй я ограничусь числом в 1 байт и соответственно ограничусь числом от 0 до 255 (для меня допустимо в принципе) .
наверное уйдут возможные ошибки *склейки* цифр

b707
Offline
Зарегистрирован: 26.05.2017

fsdb пишет:

пожалуй я ограничусь числом в 1 байт

слабак :)

fsdb
Offline
Зарегистрирован: 24.10.2015

https://alexgyver.ru/lessons/crc/

b707,  таки заставил

b707
Offline
Зарегистрирован: 26.05.2017

fsdb пишет:

https://alexgyver.ru/lessons/crc/

b707,  таки заставил

так кто заставил - ты или гайвер? :)

Если гайвер - то незачет, этот автор на нашем форуме не котируется

fsdb
Offline
Зарегистрирован: 24.10.2015

Вы - взяли на слабо :) 

попробую реализовать механизм контрольной суммы как писали выше ребята.

все расписано -  должно получиться.

еще раз Всем спасибо

b707
Offline
Зарегистрирован: 26.05.2017

одной контрольной суммы мало. Нужно организовать передачу данных пакетами с заголовком и суффиксом. иначе контрольную сумму не от чего считать будет.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

fsdb пишет:

Вы - взяли на слабо :) 

попробую реализовать механизм контрольной суммы как писали выше ребята.

все расписано -  должно получиться.

еще раз Всем спасибо

Кроме контрольной суммы, нужен еще и признак начала пакета, длина пакета. 

fsdb
Offline
Зарегистрирован: 24.10.2015

хотел 2 байта данных, 1 байт контрольный, 1 байт признак окончания пакета.
передать правильные пакеты в приоритете. потерять некоторые пакеты - не страшно на самом деле. попробую в приемнике счетчик поставить забракованных пакетов. дальше по ситуации

b707
Offline
Зарегистрирован: 26.05.2017

fsdb пишет:

1 байт признак окончания пакета.

признак окончания пакета не должен встречаться в самом пакете, в случае когда это всего 1 байт - это накладывает ограничения на передаваемые данные

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Length - 1 байт

#        - начало пакета

.

.           Данные в ASCII формате, без '#'

.

#         -  конец пакета

СRC     -  1-2 байта

 

СRC считается вся, начиная с байта длины, заканчивая вторым '#', включая его

fsdb
Offline
Зарегистрирован: 24.10.2015

crc сделал - все нормально. спасибо ребята.