Страница 1 из 1

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

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

Прилагаю проект и описание. Спасибо!

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

Добавлено: 22.05.2016{, 23:09}
Boroda
Ковыряюсь дальше.  Поспешил я с выводами...
Блок "детектор изменения строки" работает корректно, выход "новые данные" тоже. При приеме четырех байт моргает четыре раза (если в данных есть не нулевой байт). Теперь создадим такую ситуацию: отправим с железного 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("");
}
}

Проект в приложении.

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

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





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

П.С. цитата с какой-то методички по СИ: "Символьная строка в Си – это последовательность символов, которая заканчивается символом с кодом 0. Символ с кодом ноль не имеет никакого изображения, в программе его записывают как '\0' "

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

Добавлено: 23.05.2016{, 20:13}
Boroda
Все получилось. Данные с UART принимаю не строкой, а побайтово. Окончание пакета отслеживается по таймауту, как в ModBus RTU.

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

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

вот что шлет слэйф 3E 0A 06 19 27 00 67 00 FB