[英]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.