ЗАО «ЗЭО»

Техническая поддержка пользователей => Тион, Тион-Про, Тион-Про v2, Сириус => Тема начата: MOHOMAX от 14 Июля, 2011, 02:04:31

Название: Ошибки при передаче данных по RS-485
Отправлено: MOHOMAX от 14 Июля, 2011, 02:04:31
Наблюдаю ошибки при приеме и передаче данных по RS-485.
В аттаче простой пример. Отправляем по 485 один байт 0xFF. При чтении мы его же и должны получить (из за особенности передатчика RS-485). Но получаем совсем другое.

# ./test
buf[0]=FF // байт для отправки
buf[0]=5F // полученный байт

Смотрим осциллографом на линию и видим, что передается совсем не 0xFF (картинка в аттаче).

Другое проявление скорей всего этой же проблемы. Некоторые полученные данные сбрасывают старший бит. То есть, например, внешнее устройство посылает нам OxFF, осциллографом вижу, что действительно отправляется 0xFF, но тион принимает 0x7F.

Подскажите, почему такое может происходить? Как это можно исправить?

Скорость передачи 19200 (пробовал и 9600, то же самое)
Тион-про2, ОС Линукс
Название: Re: Ошибки при передаче данных по RS-485
Отправлено: MOHOMAX от 25 Июля, 2011, 11:17:08
уважаемые сотрудники ЗАО "ЗЭО", выскажете свои мысли на эту тему, пожалуйста. Из-за этой проблемы я не могу наладить связь с устройством по RS-485-му. Идет некорректный прием данных или ошибки при передаче. Пробовал на двух тионах. На обоих одинаковая проблема.
Название: Re: Ошибки при передаче данных по RS-485
Отправлено: asv от 08 Августа, 2011, 19:16:46
1.
options.c_oflag |= (SPEED | CS8 | CLOCAL | CREAD);
options.c_iflag |= (SPEED | CS8 | CLOCAL | CREAD);
Эти наборы битов совсем не для этих членов структуры.

Получите не то, что хотите:
oflag: olcuc, onlcr, ocrnl, onocr, onlret, tab1, ofdel
iflag: brkint, ignpar, parmrk, inpck, istrip, ixany, igncr

2.
options.c_cflag |= (SPEED | CS8 | CLOCAL | CREAD);
Раз уже options не обнулён, то где маска для speed и cs?

3.
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // disable ECHO
ECHONL, IEXTEN?

После такого изменения осциллограмма похожа на 0xff:

--- /tmp/test485.c 2011-08-08 18:12:24.000000000 +0400
+++ test485.c 2011-08-08 18:21:42.000000000 +0400
@@ -22,13 +22,20 @@
         return 1;
     }
     // set port options
+#if 0
     tcgetattr(fd, &options);
+#endif
+    memset(&options, 0, sizeof(struct termios));
+
     cfsetispeed(&options, SPEED);
     cfsetospeed(&options, SPEED);
+
     options.c_cflag |= (SPEED | CS8 | CLOCAL | CREAD);
+#if 0
     options.c_oflag |= (SPEED | CS8 | CLOCAL | CREAD);
     options.c_iflag |= (SPEED | CS8 | CLOCAL | CREAD);
     options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // disable ECHO
+#endif
     tcsetattr(fd, TCSANOW, &options);
 
     fsync(fd);
Название: Re: Ошибки при передаче данных по RS-485
Отправлено: MOHOMAX от 16 Августа, 2011, 11:50:48
спасибо большое за помощь! Дело действительно было в неправильной настройке последовательного порта. Я исправил по вашему примеру и ошибки пропали.