Ключевые слова:port, win, serial, gcc, ioctl, lib, (найти похожие документы)
Date: Mon, 03 Feb 2003 17:03:39 +0500
From: Valentin Nechayev <netch@segfault.kiev.ua>
Newsgroups: ftn.ru.unix.prog
Subject: Портирование программы работающей с COM-портами из Windows в Unix
GG> Возникла экстренная необходимость портировать Win32 программу на Linux, а я под
GG> него никогда не программил (сегодня только поставил).
GG> Ключевая часть проги - обмен с внешним девайсом по компорту, а так как девайс
GG> питается от компорта, то прога ещё и рулит пинами DTR, RTS (например дёргает
GG> ими (для ресета) когда девайс виснет).
GG> Hа Win32 API это упрощённо выглядит так:
GG> 1.Открыть порт hcommfile=CreateFile('COMx',.....
Далее просто названия функций-эквивалентов.
open()
GG> 2.Hастроить SetupComm(hcommfile,... //размеры буферов приёмника/передатчика
tcgetattr(), tcsetattr()
Вдумчиво прочитать man termios
Размеры буферов на этом уровне не крутятся, но они и так по максимуму,
трогать их обычно не нужно.
GG> SetCommTimeOuts(hcommfile,..//девайс повис?
Это сам будешь отрабатывать своими таймаутами.
GG> SetCommState(hcommfile,... //speed,data,stop,parity
Тот же tcsetattr()
GG> 3.Включить питание девайса
GG> EscapeCommFunction(hcommfile,CLRDTR);
GG> EscapeCommFunction(hcommfile,CLRRTS);
ioctl(,TIOCMGET) - прочитать флаги управления модемом
ioctl(,TIOCMSET) - установить флаги управления модемом
ioctl(,TIOCMBIS) - добавить --"--
ioctl(,TIOCMBIC) - снять --"--
Hапример, поднять DTR:
int mst = TIOCM_BIS;
rc = ioctl( comport_fd, TIOCMBIS, &mst );
if( rc < 0 ) perror( "ioctl(,TIOCMBIS)" );
GG> 4 и 5 Выполняется в отдельном потоке
GG> 4.Передать команду девайсу
GG> WriteFile(hCommFile,command,commandsize,....
write()
GG> 5.Принять ответ от девайса
GG> ReadFile(hcommfile,responce,responcebufflen,responcesize...
read()
GG> 6.Закрыть порт
GG> CloseHandle(hcommfile);
close()
GG> Если такие функции есть в Вин АПИ, то в Линуксе они (ИМХО) обязаны быть.
GG> Hапрвьте на истинный путь (а также URL & Books)
info libc, маны.
В info libc глава 'Low-Level Terminal Interface'
-netch-