Linux 串口属性参数——termios

发布时间 2024-01-02 10:27:58作者: bailinjun

串口属性一般包括:波特率、数据位、停止位和奇偶校验位等参数。

 RTS/CTS协议(Request To Send/Clear To Send)即请求发送/清除发送协议。

在Linux系统中用结构体 termios 来存储这些参数,这一结构体位于 termios.h 中,具体定义如下:

复制代码
struct termios
{
   unsigned short c_iflag;      //输入模式标志
   unsigned short c_oflag;      //输出模式标志
   unsigned short c_cflag;      //控制模式标志
   unsigned short c_lflag;      //本地模式标志
   unsigned char c_line;        //线路规则
   unsigned char c_cc[NCC];     //控制字
};
复制代码

 

其中每个字段的常用值如下表示所:

c_iflag字段:

IGNPAR 忽略帧错误和奇偶校验错误
INPCK 启用输入奇偶检测
ISTRIP 去掉第8位
INLCR 将输入中的NL翻译为CR
IGNCR 忽略输入中的回车
ICRNL 将输入中的回车翻译为新行(除非设置了IGNCR)
IXON 启用输出的XON/XOFF流控制
IXOFF 启用输入的XON/XOFF流控制

 

c_oflag字段:

ONLCR 将输出中的新行符映射为回车-换行
OCRNL 将输出中的回车映射为新行符
ONOCR 不在第0列输出回车
ONLRET 不输出回车
OFILL 发送填充字符作为延时,而不是使用定时来延时。

 

c_cflag字段:

CSIZE 字符长掩码。取值为CS5,CS6,CS7或CS8
CSTOPB 设置两个停止位,而不是一个。
CREAD 打开接受者
PARENB 允许输出产生奇偶信息以及输入的奇偶校验
PARODD 输入和输出的奇校验
CLOCAL 忽略modem控制线

 

c_lflag字段:

ISIG 当接受到字符INTR, QUIT, SUSP或DSUSP时,产生相应的信号
ICANON 启用标准模式,允许使用特殊字符EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS和WERASE,以及按行的缓冲
ECHO 回显输入字符
ECHOE 如果同时设置了ICANON,字符ERASE探险前一个输入字符,WERASE擦除前一个词
ECHOK 如果同时设置了ICANON,字符KILL删除当前行
ECHONL 如果同时设置了ICANON,回显字符NL,即使没有设置ECHO
NOFLSH 禁止在产生SIGINT, SIGQUIT和SIGSUSP信号时刷新输入和输出队列
TOSTOP 向试图写控制终端的后台进程组发送SIGTTOU信号

 

c_cc字段成员下标值及其所表示的含义:

VINTR (003,ETX,ctrl+c,或者0177, DEL)中断字符。发出SIGINT信号。当设置ISIG时可被识别,不再作为输入传递
VQUIT (034, FS, crtl+\)退出字符。发出SIGQUIT信号。当设置ISIG时可被识别,不再作为输入传递
VERASE (0177, DEL, 或者010, BS, ctrl+H)删除字符。删除上一个还没有删掉的字符,但不删除上一个EOF或者行首。当设置ICANON时可被识别,不再作为输入传递
VKILL (025, NAK, ctrl-U, 或者ctrl+X或@)终止字符。删除自上一个EOF或行首以来的输入。当设置ICANON时可被识别,不再作为输入传递
VEOF (004, EOT, ctrl+D)文件尾字符。更精确地说,这个字符使得tty缓冲中的内容被送到等待输入的用户程序中,而不必等到EOL。如果它是一行的第一个字符,那么用户程序的read()将返回0,指示读到了EOF。当设置ICANON时可被识别,不再作为输入传递
VMIN 非canonical模式读的最小字符数。
VEOL (0, NUL)附加的行尾字符。当设置ICANON时可被识别
VTIME 非canonical模式读时的延时,以十分之一秒为单位。
VSTART (021, DC1, Ctrl+Q)开始字符。重新开始被Stop字符中止的输出。当设置IXON时可被识别,不再作为输入传递
VSTOP (023, DC3, ctrl+S)停止字符。停止输出,直到输入Start字符。当设置IXON时可被识别,不再作为输入传递。
VSUSP (032, SUB, ctrl+Z)挂起字符。发送SIGTSTP信号。当设置ISIG时可被识别,不再作为输入传递。

 

根据上表,需要什么功能或属性,则直接在相应字段上相应位进行上述位的与或非与即可。

 

termios.h 中为设置串口属性还提供了以下函数:

复制代码
#include <termios.h>
#include <unistd.h>

int tcgetattr(int fd, struct termios* tp);
int tcsetattr(int fd, int optional_actions, struct termios* tp);
int tcsendbreak(int fd, int duration);
int tcdrain(int fd);
int tcflush(int fd, int queue_selector);
int tcflow(int fd, int action);
int cfmakeraw(struct termios* tp);
speed_t cfgetispeed(struct termios* tp);
speed_t cfgetospeed(struct termios* tp);
int cfsetispeed(struct termios* tp, speed_t speed);
int cfsetospeed(struct termios* tp, speed_t speed);
复制代码

tcgetattr()与tcsetattr()两个函数用于读取/设置指定串口的属性。

optional_actions 表示设置的参数什么时候起作用:

           TCSANOW--立即生效;

           TCSADRAIN--fd上所有的输出都被传输后生效;

           TCSAFLUSH--所有引用fd对象的数据都在传输出去后生效。

函数设置终端为原始数据方式,即恢复出厂设置。

最后四个函数用于读取/设置输入/输出的波特率。speed_t类型的值为 B0, B50, B1200, ... , B19200, B38400, ... , B115200, B230400。分别对应指定的波特率。

 

 

 

#####################################################################################################################################