在linux中使用ioctl()调用设置串口的DTR RTS引脚时遇到问题

Posted

技术标签:

【中文标题】在linux中使用ioctl()调用设置串口的DTR RTS引脚时遇到问题【英文标题】:Trouble in setting DTR RTS pins of serial port using ioctl() Call in linux 【发布时间】:2014-12-28 02:55:17 【问题描述】:

您好,我正在编写一个小代码来控制 Linux(Mint Linux 13 Maya,x86)上 USB 转串口转换器芯片 FT232 的 DTR 和 RTS 线。

我已经使用termios成功编写了代码来读写FT232芯片的数据。 现在我想控制 DTR 和 RTS 线路,所以我使用 ioctl() 调用来设置和清除 DTR 和 RTS 线路。

这里是代码

    #include <stdio.h>
    #include <fcntl.h>       /* File Control Definitions           */
    #include <termios.h>     /* POSIX Terminal Control Definitions */
    #include <unistd.h>      /* UNIX Standard Definitions          */ 
    #include <errno.h>       /* ERROR Number Definitions           */
    #include <sys/ioctl.h>   /* ioctl()                            */

    main(void)
    
        int fd;     /*File Descriptor*/
        int status; 

        fd = open("/dev/ttyUSB0",O_RDWR | O_NOCTTY ); //Opening the serial port

        ioctl(fd,TIOCMGET,&status); /* GET the State of MODEM bits in Status */
        status |= TIOCM_RTS;        // Set the RTS pin
        ioctl(fd, TIOCMSET, status);

        getchar(); //To view the change in status pins before closing the port

        close(fd);
     

代码在 gcc 上编译成功,没有任何错误。我已将两个 LED 连接到 FT232 的 RTS 和 DTR 线。由于 RTS 和 DTR 线反转,设置 RTS 将使 LED 熄灭。 Led 连接到 RTS 和 DTR 最初是 ON。

关于使用“sudo ./serial”运行代码

RTS 和 DTR Led 都熄灭,而不仅仅是 RTS(编码状态 |= TIOCM_RTS;) 并在 getchar() 之后开启。

为什么 DTR 会随着 RTS 线变低? 还 我无法使用 TIOCM_CD 、TIOCM_DTR 等更改其他调制解调器线路,如 RI、DCD、DCD、DTR 等?

【问题讨论】:

【参考方案1】:

对于TIOCMSET 命令,发送最后一个参数作为参考:

ioctl(fd, TIOCMSET, &status);

【讨论】:

以上是关于在linux中使用ioctl()调用设置串口的DTR RTS引脚时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

嗅探IOCTL和串口通信

USB Linux API:从用户空间应用调用 ioctl 请求

在 C 中使用 ioctl() 设置不可变标志

文件IO详解(十七)---ioctl函数详解

linux开发笔记

Linux下的ioctl()函数详解