FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Суббота, 03.12.2016, 05:25
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Сергей, support 
Форум » Баг - Трекер » Принятые » Проблема при приеме нуля в данных UART
Проблема при приеме нуля в данных UART
Boroda
Дата: Понедельник, 02.05.2016, 17:59 | Сообщение # 1
Майор
Группа: Проверенные
Сообщений: 149
Награды: 7
Репутация: 8
Статус: Offline
Если в посылке UART присутствует хоть одна переменная равная нулю (В00000000), то блок "прием из UART" на выходе "новые данные" никак не реагирует. Также не срабатывает блок "детектор изменения строки", подключенный на выход блока UART и не работает пользовательский блок вида:
out = false;
if (in != str_old)
{
str_old = in;
out = true;
}
Если организовать прием данных с адресом устройства и контрольной суммой, то это не мешает (флаг приема новых данных можно организовать и другими способами), но при использовании протокола связи в котором все переменные могут быть равны нулю, могут начаться проблемы с пропуском данных.

Прилагаю проект и описание. Спасибо!
Прикрепления: Null_UART.rar(748Kb)
 
Boroda Дата: Воскресенье, 22.05.2016, 23:09 | Сообщение # 2
Майор
Группа: Проверенные
Сообщений: 149
Награды: 7
Репутация: 8
Статус: Offline
Ковыряюсь дальше.  Поспешил я с выводами...
Блок "детектор изменения строки" работает корректно, выход "новые данные" тоже. При приеме четырех байт моргает четыре раза (если в данных есть не нулевой байт). Теперь создадим такую ситуацию: отправим с железного 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(68Kb)


Сообщение отредактировал Boroda - Вторник, 24.05.2016, 10:04
 
Boroda Дата: Понедельник, 23.05.2016, 10:16 | Сообщение # 3
Майор
Группа: Проверенные
Сообщений: 149
Награды: 7
Репутация: 8
Статус: Offline
Нашел баг. Похоже неправильно приравнивается String выхода блока UART и вход String следующего блока. И это не ошибка Автора. Скорее всего баг зарыт в недрах компилятора Arduino.





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

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


Сообщение отредактировал Boroda - Понедельник, 23.05.2016, 20:38
 
Boroda Дата: Понедельник, 23.05.2016, 20:13 | Сообщение # 4
Майор
Группа: Проверенные
Сообщений: 149
Награды: 7
Репутация: 8
Статус: Offline
Все получилось. Данные с UART принимаю не строкой, а побайтово. Окончание пакета отслеживается по таймауту, как в ModBus RTU.
Прикрепления: Test_logo_3.rar(58Kb)
 
Форум » Баг - Трекер » Принятые » Проблема при приеме нуля в данных UART
Страница 1 из 11
Поиск:

FLProg © 2016
Яндекс.Метрика