Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Linux и управление линиями DTR/DSR
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
ASN
Заранее приношу извинения за возможно безграмотно заданный вопрос.
Устройство подключено к РС по стандартному COM порту. Используется аппаратное управление потоком через линии CTS/RTS. Для дополнительного обмена командами (запрос коммутации – запрос от устройства/канал cкоммутирован – ответ от РС) используются линии DSR/DTR. Система функционировала под управлением DOS с прямым доступом к порту. Всё работало. При переводе системы на Linux возникла проблема - прикладной программист утверждает, что напрямую управлять DSR/DTR стандартными средствами невозможно. Неужели в Linux действительно невозможно напрямую управлять DTR/DSR?! Или я что-то не понимаю?
zltigo
Цитата(ASN @ Sep 30 2008, 21:03) *
программист утверждает...

Наглая ложь sad.gif
ASN
zltigo
Дополнительная информация: используется плата с 8-ю COM портами, которые могут работать как по интерфейсу RS232, так и RS485 (они функционирую через специальный драйвер). Тестовое программное обеспечение (оно полностью реализует необходимую функциональность), разработанное нами под WinXP, работает. Прикладное ПО под Linux разрабатывает соисполнитель. Лично мне реализованный под DOS протокол не нравиться – в нём нет фреймирования кадров вообще – используется очень жёсткая последовательность команд/данных, разграничение между которыми реализовано по размеру (даже запросить состояние устройства в произвольные моменты времени нет возможности). Но софт разработан уже давно – существенно переработать старый протокол нет ни времени, ни желания. Если не трудно, можно получить ссылку на пример использования DTR/DSR в Linux?
zltigo
Цитата(ASN @ Sep 30 2008, 21:22) *
Если не трудно, можно получить ссылку на пример использования DTR/DSR в Linux?

http://linux.die.net/man/2/ioctl далее TIOCMGET/TIOCMSET
Код
//---------------------------------------------------------------------------
// Controls the modem lines to place the microcontroller into various
//  states during the programming process.
//---------------------------------------------------------------------------
void control_MDM_lines( int DTR, int RTS )
{
#if defined COMPILE_FOR_LINUX
int status;
    if( ioctl( ie.fdCom, TIOCMGET, &status ) == 0 )
        dprint( 1, "Ioctl get ok, status = %X\n", status );
    else
        dprint( 1, "Ioctl get failed\n" );

    if( DTR )
        status |=  TIOCM_DTR;                    
    else
        status &= ~TIOCM_DTR;

    if( RTS )
        status |=  TIOCM_RTS;
    else
        status &= ~TIOCM_RTS;

    if( ioctl( ie.fdCom, TIOCMSET, &status ) == 0 )
        dprint( 1, "Ioctl set ok, status = %X\n", status );
    else
        dprint( 1, "Ioctl set failed\n" );

    if( ioctl( ie.fdCom, TIOCMGET, &status ) == 0)
        dprint( 1, "Ioctl get ok, status = %X\n", status );
    else
        dprint( 1, "Ioctl get failed\n" );

#endif // defined COMPILE_FOR_LINUX
ASN
zltigo
Спасибо за помощь.
Все линии (и RTS, и DTR) в Linux замечательно управляются. Плата ввода/вывода на 8 COM портов, подключеннная через шину PCI, как в режиме RS485, так и в режиме RS232 с аппаратным управлением потоком, работает.
a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.