Если в посылке UART присутствует хоть одна переменная равная нулю (В00000000), то блок "прием из UART" на выходе "новые данные" никак не реагирует. Также не срабатывает блок "детектор изменения строки", подключенный на выход блока UART и не работает пользовательский блок вида:
out = false;
if (in != str_old)
{
str_old = in;
out = true;
}
Если организовать прием данных с адресом устройства и контрольной суммой, то это не мешает (флаг приема новых данных можно организовать и другими способами), но при использовании протокола связи в котором все переменные могут быть равны нулю, могут начаться проблемы с пропуском данных.
Прилагаю проект и описание. Спасибо!
Проблема при приеме нуля в данных UART
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Проблема при приеме нуля в данных UART
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Проблема при приеме нуля в данных UART
Ковыряюсь дальше. Поспешил я с выводами...
Блок "детектор изменения строки" работает корректно, выход "новые данные" тоже. При приеме четырех байт моргает четыре раза (если в данных есть не нулевой байт). Теперь создадим такую ситуацию: отправим с железного 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("");
}
}
Проект в приложении.
Блок "детектор изменения строки" работает корректно, выход "новые данные" тоже. При приеме четырех байт моргает четыре раза (если в данных есть не нулевой байт). Теперь создадим такую ситуацию: отправим с железного 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("");
}
}
Проект в приложении.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Boroda 24 май 2016, 10:04, всего редактировалось 1 раз.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Проблема при приеме нуля в данных UART
Нашел баг. Похоже неправильно приравнивается String выхода блока UART и вход String следующего блока. И это не ошибка Автора. Скорее всего баг зарыт в недрах компилятора Arduino.
Добавлено (23.05.2016, 10:16)
---------------------------------------------
Походу 0х00 - признак окончания строки. При команде String=String часть строки теряется. Значит надо принимать не String'ом, а байтовым массивом. Вечером дома протестирую.
П.С. цитата с какой-то методички по СИ: "Символьная строка в Си – это последовательность символов, которая заканчивается символом с кодом 0. Символ с кодом ноль не имеет никакого изображения, в программе его записывают как '\0' "
Добавлено (23.05.2016, 10:16)
---------------------------------------------
Походу 0х00 - признак окончания строки. При команде String=String часть строки теряется. Значит надо принимать не String'ом, а байтовым массивом. Вечером дома протестирую.
П.С. цитата с какой-то методички по СИ: "Символьная строка в Си – это последовательность символов, которая заканчивается символом с кодом 0. Символ с кодом ноль не имеет никакого изображения, в программе его записывают как '\0' "
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Boroda 23 май 2016, 20:38, всего редактировалось 1 раз.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Проблема при приеме нуля в данных UART
Все получилось. Данные с UART принимаю не строкой, а побайтово. Окончание пакета отслеживается по таймауту, как в ModBus RTU.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Проблема при приеме нуля в данных UART
Вот походу у меня какая то такая же проблема, помните вы помогали мне делать блок протокола LLS. Так вот, я их немного переделал на передачу данных по LLS, блок приема команды от мастера отдельно, там все работает, блок передачи мастеру не работает, хотя посылка нормальная какая и должна быть, но мастер не видит данныхBoroda писал(а):Значит надо принимать не String'ом, а байтовым массивом
вот что шлет слэйф 3E 0A 06 19 27 00 67 00 FB
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось stapmoff 12 июл 2017, 08:38, всего редактировалось 1 раз.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя