ЗАО «ЗЭО»

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Автор Тема: Ошибки при передаче данных по RS-485  (Прочитано 6311 раз)

0 Пользователей и 1 Гость просматривают эту тему.

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43

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

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

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

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

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

Скорость передачи 19200 (пробовал и 9600, то же самое)
Тион-про2, ОС Линукс
Записан

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: Ошибки при передаче данных по RS-485
« Ответ #1 : 25 Июля, 2011, 11:17:08 »

уважаемые сотрудники ЗАО "ЗЭО", выскажете свои мысли на эту тему, пожалуйста. Из-за этой проблемы я не могу наладить связь с устройством по RS-485-му. Идет некорректный прием данных или ошибки при передаче. Пробовал на двух тионах. На обоих одинаковая проблема.
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: Ошибки при передаче данных по RS-485
« Ответ #2 : 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);
Записан

MOHOMAX

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: Ошибки при передаче данных по RS-485
« Ответ #3 : 16 Августа, 2011, 11:50:48 »

спасибо большое за помощь! Дело действительно было в неправильной настройке последовательного порта. Я исправил по вашему примеру и ошибки пропали.
Записан