一种解决方法tcsetattr fd1: input/output error

最近调试linux通信串口驱动,需要用到/dev/ttyS1,tcsetattr 设置串口报下面错误,网上很多人遇到,我的解决方法如下:
tcsetattr fd1: input/output error
原因uart驱动问题,需要修改配置驱动参数dts文件,以mpc85xx为例修改如下:
linux-2.6.35-r2\arch\powerpc\boot\dts\p1010rdb.dts:

    serial0: serial@4500 {
        cell-index = <0>;
        device_type = "serial";
        compatible = "ns16550";
        reg = <0x4500 0x100>;
        clock-frequency = <0>;
        interrupts = <42 2>;
        interrupt-parent = <&mpic>;
    };

    serial1: serial@4600 {
        cell-index = <1>;
        device_type = "serial";
        compatible = "ns16550";
        reg = <0x4600 0x100>;
        clock-frequency = <0>;
        interrupts = <42 2>;
        interrupt-parent = <&mpic>;

    };
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这是一个关于串口属性获取和设置的问题。我可以帮你解答。 `tcgetattr()` 和 `tcsetattr()` 是 Linux 系统中用于设置和获取串口属性的函数,它们可以用来控制串口的波特率、数据位、停止位、校验位等参数。 下面是一个简单的例子,演示如何使用这两个函数来获取和设置 `/dev/ttyUSB0` 串口的属性: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <termios.h> int main() { int fd; struct termios options; // 打开串口设备文件 fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY); if (fd < 0) { perror("open"); exit(1); } // 获取当前的串口属性 tcgetattr(fd, &options); // 修改波特率为9600 cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); // 设置数据位为8位 options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; // 设置停止位为1位 options.c_cflag &= ~CSTOPB; // 设置校验位为无校验 options.c_cflag &= ~PARENB; // 保存修改后的属性 tcsetattr(fd, TCSANOW, &options); // 关闭串口设备文件 close(fd); return 0; } ``` 在上面的代码中,我们首先打开了 `/dev/ttyUSB0` 设备文件,并使用 `tcgetattr()` 函数获取了当前的串口属性。然后我们使用一系列函数修改了串口的波特率、数据位、停止位、校验位等参数,最后使用 `tcsetattr()` 函数将修改后的属性保存到串口中。 需要注意的是,在修改串口属性之前,我们必须先打开串口设备文件,并使用 `tcgetattr()` 函数获取当前的属性。另外,串口的属性设置可能因为硬件设备和不同的操作系统而有所不同,需要根据实际情况进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值