Input/Output 在 ttyS0 串口上获取 termios 属性时出错

Input/Output error when getting termios attributes on ttyS0 serial port

我正在编写一个简单的程序来打开在 /dev.

中可见的串口 /dev/ttyS0

代码打开串口在我家里的电脑上没有问题但是在我的工作机器上我运行变成了returns"Input/Output Error"的错误。该错误是由于 tcgetattr 失败而出现的,但我不确定为什么串行端口是可见的。我通过 libexplain 添加了一个详细的错误打印输出,它向我报告了。

tcgetattr(fildes = 3 "/dev/ttyS0", data = 0x7FFEEA8CEEB0) failed, Input/output error (5, EIO)

我不确定我还能提供哪些其他相关信息。它是具有 5.3.8 内核的 Arch Linux 系统。

const char *port_name = "/dev/ttyS0";

int main(int argc, char *argv[])
{
   int serial_fd, file_status;
    struct termios termSettings;
    struct sigaction act = { 0 };

    serial_fd = open(port_name, O_RDWR | O_NOCTTY | O_NONBLOCK);

    if (serial_fd < 0) {
        perror("Opening serial port failed");
        return -1;
    }

    if (tcgetattr(serial_fd, &termSettings) < 0) {
        perror("Getting terminal attributes failed");
        printf("Error reason: %s\n",  explain_tcgetattr(serial_fd, &termSettings));
        goto error;
    }
   ...
}

完整的来源是here

您在问题的评论中显示的 dmesg(1) 输出显示 UART: unknown。看来这可能是问题所在。它无法识别端口 0x3f8 中的任何 uart,因此您似乎 那里没有 uart (至少,不是标准或兼容的)

该消息通常显示 UART: ns16550a 或类似内容,为您提供有关安装在那里的芯片组的信息。在您的情况下,其他参数显示为内核保留,因此其他设备无法使用这些参数。我不知道串行驱动程序不释放资源并继续运行的确切原因,但这也可能是一些遗留问题。

基于 PC 的 uart 通常仅在系统中的固定位置被硬连线配置识别,并被执行(发送一些无害的命令以查看它是否响应)以被识别,因为 它们是遗留设备,早于 PnP 或 PCI 设备,因此必须在众所周知的地方用软件探测它们。这就是软件正在做的事情。

如果您知道安装了物理端口设备,请尝试使用 BIOS SETUP 检查串行端口是否已在 BIOS 中启用(如果没有,您将根本看不到它)。如果没有,请启用它,然后重试。