modem_open()

Открыть последовательный порт

Прототип:

#include <sys/modem.h>
int modem_open( char *device,
speed_t baud );

Аргументы:

device
Путь к последовательному порту, который необходимо открыть.
baud
0 либо значение скорости передачи.

Библиотека:

libc

Описание:

Функция modem_open() открывает последовательный порт, указанный в device. Устройство устанавливается в исходный режим с помощью изменения флагов управления при использовании функций tcgetattr() и tcsetattr() следующим образом:

termio.c_cflag = CS8 | IHFLOW | OHFLOW | CREAD | HUPCL;
termio.c_iflag = BRKINT;
termio.c_lflag = IEXTEN;
termio.c_oflag = 0;

Любые символы, ожидающие ввода или вывода, сбрасываются.

Если baud не равен нулю, скорость передачи устанавливается в соответствии с этим значением.

Возвращаемое значение:

Значение открытого файлового дескриптора, либо -1 при ошибке, код ошибки записывается в errno.

Коды ошибок:

EACCES
Права поиска для компонента префикса пути к файлу отсутствуют, либо файл отсутствует.
EBADFSYS
Во время попытки открыть файл были обнаружены повреждения. Системный сбой, автоматическое восстановление после которого невозможно, возник во время записи файла или обновления директории. Необходимо выполнить дополнительные действия для исправления ошибки.
EBUSY
Блочное устройство device уже открыто для записи, либо устройство device находится в файловой системе, которая была примонтирована с открытием данного устройства на запись, либо device уже используется.
EINTR
Операция открытия была прервана сигналом.
EISDIR
Путь device является директорией.
ELOOP
Слишком много уровней символических ссылок или префиксов.
EMFILE
В данный момент процесс использует слишком много файловых дескрипторов.
ENAMETOOLONG
Длина строки device превышает PATH_MAX или часть пути к файлу длиннее, чем NAME_MAX.
ENFILE
В данный момент в системе открыто слишком много файлов.
ENOENT
Файла device не существует, либо device содержит пустую строку.
ENOSYS
Функция modem_open() не реализована для файловой системы, в которой находится device.
ENOTDIR
Часть префикса device не является директорией.
ENXIO
Ни один процесс не открыл файл для чтения.

Примеры:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/modem.h>
#include <stdio.h>
#include <errno.h>
/*
* curstate curflags newstate newflags newtimeout newquiet retvalue pattern response
*/
struct modem_script table[] = {
{1, 0, 1, 0, 2, 5, 0, NULL, "ATZ\\r\\P0a"},
{1, 0, 2, 0, 30, 5, 0, "*ok*", "ATDT5910934"},
{2, MODEM_BAUD, 3, MODEM_LASTLINE, 10, 5, 0, "*connect*", NULL},
{3, 0, 4, 0, 8, 5, 0, "*login:*", "guest"},
{4, MODEM_NOECHO, 5, 0, 15, 5, 0, "*password:*", "xxxx"},
{5, 0, 0, 0, 0, 0, 0, "*$ *", NULL},
{0, 0, 0, 0, 0, 0, 1, "*no carrier*", NULL},
{0, 0, 0, 0, 0, 0, 2, "*no answer*", NULL},
{0, 0, 0, 0, 0, 0, 3, "*no dialtone*", NULL},
{0, 0, 0, 0, 0, 0, 4, "*busy*", NULL},
{ NULL }
};
void io( char* progress, char* in, char* out )
{
if ( progress )
printf( "progress: %s\n", progress );
if ( in )
printf( "input: %s\n", in );
if ( out )
printf( "output: %s\n", out );
}
int main( int argc, char* argv[] )
{
int fd, status;
speed_t baud = -1;
if ( (fd = modem_open( argv[1], 0 )) == -1 )
{
fprintf( stderr, "Unable to open %s: %s\n", argv[1],
strerror( errno ) );
exit( 1 );
}
status = modem_script( fd, table, &baud, &io, NULL );
printf( "status=%d baud=%d\n", status, baud );
exit( status );
}

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

struct modem_script, modem_read(), modem_script(), modem_write()




Предыдущий раздел: Описание API системной библиотеки