繁体   English   中英

在 ttyS0 串行端口上获取 termios 属性时出现输入/输出错误

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

我正在编写一个简单的程序来打开 /dev 中可见的串行端口 / /dev /dev/ttyS0

该代码在家中的 PC 上打开串行端口没有问题,但在我的工作机器上,我遇到返回“输入/输出错误”的错误。 该错误是由于tcgetattr失败而出现的,但我不确定为什么串行端口是可见的。 我通过libexplain添加了一个详细的错误打印输出并报告给我。

tcgetattr(fildes = 3 "/dev/ttyS0", data = 0x7FFEEA8CEEB0) 失败,输入/输出错误 (5, EIO)

我不确定我可以提供哪些其他相关信息。 它是带有 5.3.8 kernel 的 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;
    }
   ...
}

完整的源码在这里

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM