Официальный форум СВД Встраиваемые Системы
05 Декабря, 2016, 19:37:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с полудуплексным RS485  (Прочитано 928 раз)
Tacio
Пользователь

Сообщений: 35


« : 09 Ноября, 2014, 10:04:37 »

Тема, конечно, старая, но задача у меня подобная.
Имется система КПДА.10964-01. Необходимо работать с RS485 портом, у которого нет аппаратного RTS, поэтому приходится его программно устанавливать и снимать. На данный момент код отправки данных в порт выглядит следующим образом:
Отрывок кода инициализации порта:
Код:
rsopt.c_cflag &= ~(CSIZE | IHFLOW | OHFLOW);
rsopt.c_cflag &= ~(PARENB | CSTOPB);
rsopt.c_cflag |= CS8 | CLOCAL | CREAD;
cfsetispeed(&rsopt, B115200);
cfsetospeed(&rsopt, B115200);

Отрывок кода записи в порт:
Код:
tcflush(fd, TCIOFLUSH);

/* Let's turn ON RTS now. */
int data = _CTL_RTS_CHG | _CTL_RTS;
devctl(fd, DCMD_CHR_SERCTL, &data, sizeof(data), NULL);

if(write(fd, buf, size) == -1)
    return 1;
else {
    const double us = (double)(8 * size * 1000000L) / (double)93333; //количество мкс, необходимых для отправки size байт данных при скорости 115200
    usleep(us + 75); //накинем ещё немного навсяк
    /* Let's turn OFF RTS now. */
    data = _CTL_RTS_CHG | 0;
    devctl(fd, DCMD_CHR_SERCTL, &data, sizeof(data), NULL);;
    return 0; //Success
}

На 99% всё работает нормально, однако при последующем приёме данных первый и последний байт принятых данных равны 0. То есть считывается обычно на 2 байта больше, чем было отправлено другой стороной.
93333 - скорость в бит/с, которая была вычислена экспериментально по осциллографу. Хотя длительность одного бита по тому же осциллографу соответствует скорости 115200.
Может есть какое-то более грамотное и надёжное решение?
Записан
Андрей Сеньков
Администратор
Опытный пользователь

Сообщений: 262



WWW
« Ответ #1 : 10 Ноября, 2014, 19:15:00 »

Здравствуйте!

На мой взгляд, в данном случае лучше учесть специфику контроллера на уровне драйвера.  Драйвер devc-ser8250 доступен в исходных кодах, например, в составе x86 QNX 6.5 BSP: http://community.qnx.com/sf/frs/do/downloadFile/projects.bsp/frs.x86_bios.bsp_nto650_x86_bios_trunk/frs36278?dl=1
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 06 Октября, 2016, 12:39:11