串口属性一般包括:波特率、数据位、停止位和奇偶校验位等参数。
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。分别对应指定的波特率。
#####################################################################################################################################