从 Unix 中的串行端口读取时出现输入/输出错误

问题描述

我的串口配置与此链接中的配置接近: 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;
    }

在我读取一个字符后,有时它返回读取的字符,有时它给我这个错误

error reading: Input/output error 
error no.5

我一运行程序就会出现这个错误。我该如何解决这个问题?

我还注意到,当我打印变量 received 时,它首先打印 0,然后打印 -1,然后打印提到的错误

解决方法

很可能您正在尝试以比输入更快的速度读取数据 - 如果您尝试读取一个字符,当没有可用字符时,这确实是一个 IO 错误。

你有几种可能性:

  • 使用阻塞模式(这将在调用 read() 时冻结程序,直到数据可用
  • 使用 select 确保您只尝试阅读(如果有可用字符)
  • 使用特定于平台的机制(如 epoll
  • 使用库(如 libev)来抽象出这些问题。