#c #linux #serial-port
#c #linux #последовательный порт
Вопрос:
Мои конфигурации для последовательного порта близки к приведенной в этой ссылке : Serial-programming-HOWTO в неканоническом режиме ввода. Это мой код, в котором возникает проблема:
char buffer;
int received;
while (true) {
received = read(serial_com,
amp;buffer,
sizeof(buffer));
if (received < 0) {
perror("error reading") << endl;
cout << "error no." << errno;
//exit(1);
}
cout << buffer;
}
После того, как я прочитал один символ, иногда он возвращает прочитанный символ, а в других случаях выдает мне эту ошибку:
error reading: Input/output error
error no.5
Эта ошибка возникает, как только я запускаю программу. Как я могу это исправить?
Я также заметил, что когда я печатаю переменную received
, она сначала печатает 0
, а затем печатает -1
, а затем печатает указанную ошибку.
Комментарии:
1. Это руководство, которое вы цитируете, содержит код низкого качества. Для надежного и переносимого кода изучите правильную настройку режимов терминала . Вам необходимо предоставить более подробную информацию: например, ваше оборудование и минимальный, полный и проверяемый пример. Ваш вопрос не имеет ответа, как есть, и будет привлекать в основном ошибки.
Ответ №1:
Скорее всего, вы пытаетесь прочитать данные быстрее, чем они поступают, и если вы пытаетесь прочитать символ, когда ни один из них не доступен, это действительно ошибка ввода-вывода.
У вас есть несколько возможностей:
- Используйте режим блокировки (это заморозит программу при
read()
вызове, пока не будут доступны данные - используйте
select
, чтобы убедиться, что вы пытаетесь читать только при наличии доступного символа - используйте механизм, специфичный для paltform (например
epoll
) - Используйте библиотеку (например
libev
), чтобы абстрагироваться от этих проблем.
Комментарии:
1. Я использовал эту строку для использования режима блокировки:
fcntl(serial_com, F_SETFL, 0);
но все равно выдает ту же ошибку2. хорошо, я использовал VMIN = 1 и VTIME = 0 для блокировки, и он должен подождать, пока не прочитает символ правильно? но все же это выдает мне эту ошибку
3. «вы пытаетесь прочитать символ, когда ни один из них не доступен, это действительно ошибка ввода-вывода» — неверно, ожидаемая ошибка должна быть EAGAIN . Данные из последовательного порта полностью буферизуются подсистемой termios. См. Схему потоков данных в последовательных драйверах Linux