ILD

uart & tty program
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2024-10-15 站点:Inside Linux Development

uart设备的读写,和普通的文件读写没有啥不同,都是open/read/write。

uart参数的设置,有两种接口,一个是ioctl()接口,一个是termios(3)描述的POSIX接口。


有两个结构体用来描述terminals and serial lines。

struct termios

struct termios2


<asm/termbits.h>和<termios.h>都定义了struct termios,且这两个结构体不兼容。


termios接口

       #include <termios.h>
       #include <unistd.h>

       int tcgetattr(int fd, struct termios *termios_p);
       int tcsetattr(int fd, int optional_actions,
                     const struct termios *termios_p);

       int tcsendbreak(int fd, int duration);
       int tcdrain(int fd);
       int tcflush(int fd, int queue_selector);
       int tcflow(int fd, int action);

       void cfmakeraw(struct termios *termios_p);

       speed_t cfgetispeed(const struct termios *termios_p);
       speed_t cfgetospeed(const struct termios *termios_p);

       int cfsetispeed(struct termios *termios_p, speed_t speed);
       int cfsetospeed(struct termios *termios_p, speed_t speed);
       int cfsetspeed(struct termios *termios_p, speed_t speed);


ioctl接口

       #include <sys/ioctl.h>
       #include <asm/termbits.h>   /* Definition of struct termios,
                                      struct termios2, and
                                      Bnnn, BOTHER, CBAUD, CLOCAL,
                                      TC*{FLUSH,ON,OFF} and other constants */

       int ioctl(int fd, int cmd, ...);

        Get and set terminal attributes

        TCGETS/TCSETS/

        TCGETS2/TCSETS2


        Get and set window size

        TIOCGWINSZ

        TIOCSWINSZ


使用ioctl设置波特率等参数的例子:

int uart_set(int fd, struct uart *uart)
{
        struct termios2 tio;
        int ret;

        ret = ioctl(fd, TCGETS2, &tio);
        if (ret)
                return -1;
    
        if (uart->baud_rate) {
                tio.c_cflag &= ~CBAUD;
                tio.c_cflag |= BOTHER;
                tio.c_ospeed = uart->baud_rate;

                tio.c_cflag &= ~(CBAUD << IBSHIFT);
                tio.c_cflag |= BOTHER << IBSHIFT;
                tio.c_ispeed = uart->baud_rate;
        }
    
        ret = ioctl(fd, TCSETS2, &tio);
        if (ret)
                return -2;
    
        return 0;
}


man termios

man ioctl_tty


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.