Название: Чтение из Com порта под linux Отправлено: nkly777 от Февраль 15, 2007, 16:23 Для чтения данных из com порта использую функцию read(). В Serial Programming Guide for POSIX Operating Systems написано что работает она следующим образом:
"Когда вы работаете с портом в режиме не структурированного посимвольного обмена (raw data mode), каждый системный вызов read() будет каждый раз возвращать число символов реально прочитанных в буфер ввода. Если в текущий момент нет символов доступных для чтения, то вызов будет блокироваться (wait) до тех пор пока не появятся символы для чтения, или закончится счетчик таймаута, или обнаружится какая-нибудь ошибка. Функцию read можно выполнить так, что она вернет управление немедленно. Для этого она должна быть оформлена следующим образом: Цитировать fcntl(fd, F_SETFL, FNDELAY); Опция FNDELAY указывает функции read возвращать 0 если нет символов доступных для чтения из последовательного порта. Для восстановления нормально поведения (с блокировками), необходимо вызвать fcntl() без опции FNDELAY: Цитировать fcntl(fd, F_SETFL, 0); Это также выполняется после открытия последовательного порта с опцией O_NDELAY. " Я написал следующий код: Цитировать #include <fcntl.h> /* File control definitions */ #include <iostream> int open_port(void); //Функция открытия порта int kolvo_bait_from_port=5; //Количество байт считываемых с порта функцией read. int main() { char buf[kolvo_bait_from_port]; int k; int fd=open_port(); while(1) { k=read(fd,buf,kolvo_bait_from_port); std::cout<<"Read return "<<k<<std::endl; } close(fd); } int open_port(void) { int fd; fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd == -1) { std::cout<<"open_port: Unable to open /dev/ttyS0 - "<<std::endl; } else fcntl(fd, F_SETFL, 0); return (fd); } Если в com порту есть что читать то все нормально,а если нет то функция read() ждет когда появятся символы для чтения. Как правильно настроить функцию read под linuxом чтобы она сразу возвращала 0 при отсутствии символов? Если можно рабочий пример. Название: Чтение из Com порта под linux Отправлено: nkly777 от Февраль 19, 2007, 10:01 Ну раз никто не отвечает значит придется отвечать самому. Сам разобрался, если кому интересно то читайте.
Оказывается флаг O_NONBLOCK для функции open работает. Если после того как мы открываем порт с флагом O_NONBLOCK вызвать функцию read и при этом на входе у нас нет символов, то read не переходит в режим ожидания символов, а завершает работу с кодом не ноль, как написано в документации, а с кодом -1, как при ошибке. Далее организуем бесконечный цикл условием прерывания которого будет возвращение функцией read значения отличного от -1 и все получится. Нашел еще почти готовый пример с использованием функции select |