|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Valentin Nechayev 2:5020/400 05 Dec 2003 02:31:37 To : Andrey Nebogin Subject : Re: Программирование, rs232, исходник -------------------------------------------------------------------------------- >>> Andrey Nebogin wrote: AN> fd = open( "/dev/cuaa1", O_RDWR | O_NOCTTY | O_NDELAY ); O_NOCTTY не нужен для BSD, хотя нужен для переносимости. O_NDELAY в классике - совсем не то. Тебе нужен O_NONBLOCK. Hа FreeBSD они одинаковы, но при переносе будет диверсия. Кстати, на cua устройстве вообще нет разницы, есть nonblock или нет в момент открытия устройства. AN> if( fd > 0 ) if( fd != -1 ) а у тебя какая-то совершенно левая проверка. А вообще лучше было сделать так: if( fd == -1 ) err( 1, "open(port" ); оно сразу и ошибку расскажет. (Hе забыть #include <err.h>) AN> { AN> fcntl( fd, F_SETFL, 0 ); Hу предположим. Хотя в идеале надо читать текущий состав флагов и сбрасывать только один. AN> tcgetattr( fd, &options ); AN> cfsetispeed( &options, B57600 ); А чего только входящая скорость? Исходящая тебя устраивает какая была? AN> options.c_cflag |= ( CLOCAL | CREAD | CS8 ); AN> options.c_cflag &= ~( PARENB | CSTOPB | CSIZE ); AN> options.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG); AN> options.c_oflag &= ~OPOST; cfmakeraw() могло бы быть удобнее по крайней мере для части действий. AN> for( tries=0; tries<3; tries++ ) Вот здесь начинаются самые большие чудеса. К сожалению, задача такая, что для нормальной её реализации нужен алгоритм примерно следующего вида: до_посинения { если можно читать - прочитать и сложить в буфер; если в буфере сложилось что-то осмысленное - интерпретировать; если данные в буфере начинаются с того, что явно не имеет смысл - выбросить это начало данных; если есть что писать из выходного буфера - попробовать записать; спать пока не ( рак свистнул или можно прочитать из порта и есть во входном буфере место куда читать или можно записать в порт и в выходном буфере есть данные чтобы писать ) } у тебя же могут в текущем варианте данные поступать по частям - например, разорвался ответ станции пополам, в первый read() половина и в следующий половина. А ты не сможешь собрать их в один и обработать. -netch- --- ifmail v.2.15dev5.1 * Origin: Dark side of coredump (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/736838131695.html, оценка из 5, голосов 10
|