Input/Output 在 Unix 中从串口读取时出错
Input/Output error when reading from serial port in Unix
我对串口的配置接近于这个link:
Serial-programming-HOWTO 非规范输入模式。这是我发生问题的代码:
char buffer;
int received;
while (true) {
received = read(serial_com,
&buffer,
sizeof(buffer));
if (received < 0) {
perror("error reading") << endl;
cout << "error no." << errno;
//exit(1);
}
cout << buffer;
}
在我读取一个字符后,有时它 returns 读取的字符,有时它会给我这个错误:
error reading: Input/output error
error no.5
我一运行程序就出现这个错误。我该如何解决这个问题?
我还注意到,当我打印变量 received
时,它首先打印 0
,然后打印 -1
,然后打印提到的错误。
很可能您正在尝试读取数据的速度比数据进来的速度快 - 如果您尝试读取一个字符,当 none 可用时,这确实是一个 IO 错误。
你有几种可能性:
- 使用阻塞模式(这会在
read()
调用时冻结程序,直到数据可用
- 使用
select
确保您只尝试阅读,如果有可用的字符
- 使用特定于平台的机制(如
epoll
)
- 使用库(如
libev
)来抽象掉这些问题。
我对串口的配置接近于这个link: Serial-programming-HOWTO 非规范输入模式。这是我发生问题的代码:
char buffer;
int received;
while (true) {
received = read(serial_com,
&buffer,
sizeof(buffer));
if (received < 0) {
perror("error reading") << endl;
cout << "error no." << errno;
//exit(1);
}
cout << buffer;
}
在我读取一个字符后,有时它 returns 读取的字符,有时它会给我这个错误:
error reading: Input/output error
error no.5
我一运行程序就出现这个错误。我该如何解决这个问题?
我还注意到,当我打印变量 received
时,它首先打印 0
,然后打印 -1
,然后打印提到的错误。
很可能您正在尝试读取数据的速度比数据进来的速度快 - 如果您尝试读取一个字符,当 none 可用时,这确实是一个 IO 错误。
你有几种可能性:
- 使用阻塞模式(这会在
read()
调用时冻结程序,直到数据可用 - 使用
select
确保您只尝试阅读,如果有可用的字符 - 使用特定于平台的机制(如
epoll
) - 使用库(如
libev
)来抽象掉这些问题。