Проблема при приеме нуля в данных UART

В этот форум модератором или автором переносятся темы из форума "Принятые" которые приняты к рассмотрению и исправлению
Ответить
Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Проблема при приеме нуля в данных UART

#1

Сообщение Boroda » 02.05.2016{, 17:59}

Если в посылке UART присутствует хоть одна переменная равная нулю (В00000000), то блок "прием из UART" на выходе "новые данные" никак не реагирует. Также не срабатывает блок "детектор изменения строки", подключенный на выход блока UART и не работает пользовательский блок вида:
out = false;
if (in != str_old)
{
str_old = in;
out = true;
}
Если организовать прием данных с адресом устройства и контрольной суммой, то это не мешает (флаг приема новых данных можно организовать и другими способами), но при использовании протокола связи в котором все переменные могут быть равны нулю, могут начаться проблемы с пропуском данных.

Прилагаю проект и описание. Спасибо!
Вложения
Null_UART.rar
(747.98 КБ) 77 скачиваний

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Проблема при приеме нуля в данных UART

#2

Сообщение Boroda » 22.05.2016{, 23:09}

Ковыряюсь дальше.  Поспешил я с выводами...
Блок "детектор изменения строки" работает корректно, выход "новые данные" тоже. При приеме четырех байт моргает четыре раза (если в данных есть не нулевой байт). Теперь создадим такую ситуацию: отправим с железного UARTa на софтовый четыре байта STRINGом (0x10,0x00,0xD7,0xF5) и отправим обратно на софтовый для контроля на ПК.

1. отправляем (0x10,0x00,0xD7,0xF5), получаем (0x10,0x00,0x06,0x00), далее меняем данные.
2. отправляем (0x10,0x01,0xD7,0xF4), получаем (0x10,0x01,0xD7,0xF4), далее меняем данные.
3. отправляем (0x10,0x00,0xD7,0xF5), получаем (0x10,0x00,0xD7,0xF4), далее меняем данные.
4. отправляем (0x10,0x02,0xD7,0xF7), получаем (0x10,0x02,0xD7,0xF7), далее меняем данные.
5. отправляем (0x10,0x06,0xD7,0xF3), получаем (0x10,0x06,0xD7,0xF3), далее меняем данные.
6. отправляем (0x10,0x00,0xD7,0xF5), получаем (0x10,0x00,0xD7,0xF3).

Почему-то все байты после нулевого берутся из предыдущей посылки, только если в данных присутствует ноль. Хотя буфер UART очищается после каждого приема.

Код приемника:

ok = false; // данные не пришли
out1 = 0;   // обнуляем выходные данные
out2 = 0;
out3 = 0;
out4 = 0;
if ( en )     // пришли новые данные от блока UART?
{
if (in.length() == 4)   // длина строки = 4 ?
{
out1 = byte( in.charAt(0) );  // вытаскиваем по одному байту из строки
out2 = byte( in.charAt(1) );
out3 = byte( in.charAt(2) );
out4 = byte( in.charAt(3) );
ok = true;                           // флаг "данные пришли"
in = String("");
}
}

Проект в приложении.
Вложения
Bad_uart_null.rar
(67.92 КБ) 103 скачивания
Последний раз редактировалось Boroda 24.05.2016{, 10:04}, всего редактировалось 1 раз.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Проблема при приеме нуля в данных UART

#3

Сообщение Boroda » 23.05.2016{, 10:16}

Нашел баг. Похоже неправильно приравнивается String выхода блока UART и вход String следующего блока. И это не ошибка Автора. Скорее всего баг зарыт в недрах компилятора Arduino.





Добавлено (23.05.2016, 10:16)
---------------------------------------------
Походу 0х00 - признак окончания строки. При команде String=String часть строки теряется. Значит надо принимать не String'ом, а байтовым массивом. Вечером дома протестирую.

П.С. цитата с какой-то методички по СИ: "Символьная строка в Си – это последовательность символов, которая заканчивается символом с кодом 0. Символ с кодом ноль не имеет никакого изображения, в программе его записывают как '\0' "
Вложения
8287194.jpg
0752348.jpg
Последний раз редактировалось Boroda 23.05.2016{, 20:38}, всего редактировалось 1 раз.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Проблема при приеме нуля в данных UART

#4

Сообщение Boroda » 23.05.2016{, 20:13}

Все получилось. Данные с UART принимаю не строкой, а побайтово. Окончание пакета отслеживается по таймауту, как в ModBus RTU.
Вложения
Test_logo_3.rar
(58.13 КБ) 98 скачиваний

Аватара пользователя
stapmoff
Лейтенант
Сообщения: 341
Зарегистрирован: 16.05.2016{, 10:21}
Репутация: 4

Проблема при приеме нуля в данных UART

#5

Сообщение stapmoff » 12.07.2017{, 08:37}

Boroda писал(а):Значит надо принимать не String'ом, а байтовым массивом
Вот походу у меня какая то такая же проблема, помните вы помогали мне делать блок протокола LLS. Так вот, я их немного переделал на передачу данных по LLS, блок приема команды от мастера отдельно, там все работает, блок передачи мастеру не работает, хотя посылка нормальная какая и должна быть, но мастер не видит данных

вот что шлет слэйф 3E 0A 06 19 27 00 67 00 FB
Вложения
LLS.flp
(274.26 КБ) 83 скачивания
Последний раз редактировалось stapmoff 12.07.2017{, 08:38}, всего редактировалось 1 раз.

Ответить

Вернуться в «Принятые»