Linux - чтение последовательного порта, возвращая EAGAIN

Мы раньше видели тех много с нашим веб-клиентом очень интенсивного трафика - удивление, если это связано. То, что, предположительно, происходило, было HttpWebRequest (я предполагаю, что у Вас есть проблемы с HttpWebResponse? Возможно, у них есть те же проблемы), использует некоторый janky пул потоков под покрытиями, , даже когда Ваши запросы синхронны. Время от времени что-то зашло бы в тупик, потому что некоторый другой объект.NET выше в стеке использовал тот же системный пул потоков, и можно было бы исчерпать ресурсы другой, в конечном счете вызвав тайм-аут. Я думаю, что проблема лучше описана здесь: http://www.deez.info/sengelha/2005/03/03/beware-threadpools-and-httpwebrequest/

10
задан Bill the Lizard 29 March 2011 в 01:56
поделиться

4 ответа

Прочтите это .

EAGAIN Неблокирующий ввод-вывод был выбрано с помощью O_NONBLOCK и без данных был немедленно доступен для чтения.

11
ответ дан 3 December 2019 в 23:50
поделиться

см. мои образцы кода, если EAGAIN, вы бы попробовали чтобы прочитать еще раз:

...
options.c_cflag &= ~PARENB; 
options.c_iflag &= ~INPCK; 
...
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // input
options.c_oflag &= ~OPOST; // output
...
fd = open("/dev/ttyUSB0", O_RDWR | O_NDELY | O_NOCTTY);
fcntl(fd, F_SETFL, 0);
...
int nc = write(hCom, txchar, n);
msleep(500); // wait 500ms
fcntl(hCom, F_SETFL, FNDELAY); // don't block serial read
ret = read(hCom, rxchar, n);
if (ret > 0) {
    here had read n bytes or just partial data, read again if partial.
} 
if (ret < 0) {
    if (EAGAIN == errno) {
        not a real error, just read again.
    } else {
        oops, errors.
    }
}
...
0
ответ дан 3 December 2019 в 23:50
поделиться

EAGAIN с O_NONBLOCK означает, что данные по порту не получены. Убедитесь, что порт и кабель работают должным образом (с помощью minicom или другой заведомо исправной программы), и что пульт действительно отправляет некоторые данные.

0
ответ дан 3 December 2019 в 23:50
поделиться

У меня такая же проблема. Я могу передавать, но не могу принимать (через переходный кабель USB-RS232). Я пробовал использовать другой Linux-сервер с портом RS232, и он работал нормально. Единственное изменение, которое я сделал, было с / dev / ttyUSB0 на / dev / ttyS0 . Первый компьютер был Fedora, второй - Debian. Кроме этого, не знаю.

Еще кое-что. Когда я закрываю программу com и перезапускаю ее, моя программа считывает данные! Данные - это входной буфер, но моя программа этого не знает. Кроме того, gtkterm работает нормально, так что с ч / б все в порядке. Моя программа не видит прерывания UART.

Этот уровень абстракции linux h / w довольно фальшивый. Это не должно быть проблемой.

0
ответ дан 3 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: