Linux串口编程(2)

该结构体中c_cflag最为重要,可设置波特率、数据位、校验位、停止位。在设置波特率时需要在数字前加上'B'。


c_lflag成员


ISIG 当接收到字符INTR,QUIT,SUSP或DSUSP时,产生相应的信号。

XCASE (不属于POSIX;LINUX下不支持)如果同时设置了ICANON,终端只有大写。输入被转换为小写,除了以/前缀的字符。输出时,大写字符被前缀/,小写字符被转换成大写。

ECHO 回显输入字符。

ECHOE 如果同时设置了ICANON,字符ERASE擦除前一个输入字符,WERASE擦除前一个词。

ECHOK 如果同时设置了ICANON,字符KILL删除当前行。

ECHONL 如果同时设置了ICANON,回显字符NL,即使没有设置ECHO。

ECHOCTL (不属于POSIX)如果同时设置了ECHO,除了TAB,NL,START和STOP之外的ASCII控制信号被回显为^x,这里X是比控制信号大0x40的ASCII码。例如字符0x08(BS)被回显为^H。

ECHOPRT (不属于POSIX)如果同时设置了ICANON和IECHO,字符在删除的同时被打印。

ECHOKE (不属于POSIX)如果同时设置了ICANON,回显KILL时将删除一行中的每个字符,如同指定了ECHOE和ECHORPT一样。

DEFECHO (不属于POSIX)只在一个进程读的时候回显。

FLUSHO (不属于POSIX;LINUX不支持)输出被刷新。这个标志可以通过键入字符DISCARD来打开和关闭。

NOFLSH 禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列。

TOSTOP 向试图写控制终端的后台进程组发送SIGTTOU信号。

PENDIN (不属于POSIX;LINUX不支持)在读入一个字符时,输入队列中的所有字符被重新输出。(bash用他来处理typeahead)。

IEXTEN 启用实现自定义的输入处理。这个标志必须与ICANON同时使用,才能解释特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC标志才有效。


c_iflag成员

Flag Description

GNBRK 忽略输入中的BREAK状态

BRKINT 如果设置了IGNBRK,将忽略BREAK。如果没有设置,但是设置了BRKINT,那么BREAK将使得输入和输出队列被刷新,如果终端是一个前台进程 组的控制终端,这个进程组中所有进程将收到SIGINT信号。如果既未设置IGNBRK也未设置BRKINT,BREAK将视为NUL同义字符,除非设置 了PARMRK,这种情况下被视为序列/377/0/0

IGNPAR 忽略桢错误和奇偶校验错误

PARMRK 如果没有设置IGNPAR,在有奇偶校验错误或者桢错误的字符前插入/377/0。如果既没有设置IGNPAR也没有设置PARMRK,将所有奇偶校验错误或者桢错误的字符视为/0。

INPCK 启用输入奇偶校验检测。

ISTRIP 去掉第八位。

INLCR 将输入的NL翻译为CR。

IGNCR 忽略输入中的回车。

ICRNL 将输入中的回车翻译为新行字符(除非设置了IGNCR)。

IUCLC (不属于POSIX)将输入中的大写字母映射为小写字母。

IXON 启用输出的XON/XOFF流控制

IXANY (不属于POSIX。1;XSI)允许任何字符来重新开始输出。

IXOFF 启用输入的XON/XOFF流控制

IMAXBEL (不属于POSIX)当输入队列满时响铃。LINUX没有实现该位,总是将其视为已设置。

 

c_oflag成员


OPOST 启用具体实现自行定义的输出。

OLCUC (不属于POSIX)将输出中的小写字母映射为大写字母。

ONLCR (XSI)将输出中的新行符映射为回车-换行

OCRNL 将输出中的回车映射为新行符。

ONOCR 不在第0列输出回车。

ONLRET 不输出回车。

OFILL 发送填充字符作为延时。

OFDEL (不属于POSIX)填充字符是ASCII DEL(0177)。如果不设置填充字符则是ASCII NUL。

NLDLY 新行延时掩码。取值为NL0和NL1。

CRDLY 回车延时掩码。取值为CR0,CR1,CR2或CR3。

TABDLY 水平跳格延时掩码。取值为TAB0,TAB1,TAB2,TAB3(或XTABS)。取值为TAB3,即XTABS,将扩展跳格为空格(每个跳格符填充8个空格)。

BSDLY 回车延时掩码。取值为BS0或BS1.(从来没有被实现)

VTDLY 竖直跳格掩码。取值为VT0或VT1。

FFDLY 进表延时掩码。取值为FF0或者FF1。


c_lflag成员

Flag Description

ISIG 当接收到字符INTR,QUIT,SUSP或DSUSP时,产生相应的信号。

XCASE (不属于POSIX;LINUX下不支持)如果同时设置了ICANON,终端只有大写。输入被转换为小写,除了以/前缀的字符。输出时,大写字符被前缀/,小写字符被转换成大写。

ECHO 回显输入字符。

ECHOE 如果同时设置了ICANON,字符ERASE擦除前一个输入字符,WERASE擦除前一个词。

ECHOK 如果同时设置了ICANON,字符KILL删除当前行。

ECHONL 如果同时设置了ICANON,回显字符NL,即使没有设置ECHO。

ECHOCTL (不属于POSIX)如果同时设置了ECHO,除了TAB,NL,START和STOP之外的ASCII控制信号被回显为^x,这里X是比控制信号大0x40的ASCII码。例如字符0x08(BS)被回显为^H。

ECHOPRT (不属于POSIX)如果同时设置了ICANON和IECHO,字符在删除的同时被打印。

ECHOKE (不属于POSIX)如果同时设置了ICANON,回显KILL时将删除一行中的每个字符,如同指定了ECHOE和ECHORPT一样。

DEFECHO (不属于POSIX)只在一个进程读的时候回显。

FLUSHO (不属于POSIX;LINUX不支持)输出被刷新。这个标志可以通过键入字符DISCARD来打开和关闭。

NOFLSH 禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列。

TOSTOP 向试图写控制终端的后台进程组发送SIGTTOU信号。

PENDIN (不属于POSIX;LINUX不支持)在读入一个字符时,输入队列中的所有字符被重新输出。(bash用他来处理typeahead)。

IEXTEN 启用实现自定义的输入处理。这个标志必须与ICANON同时使用,才能解释特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC标志才有效。


下面写的小例子是设置串口的一般过程


#ifndef SETCOMCONFIG_H
#define SETCOMCONFIG_H

#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>


int set_com_config(int fd, int _speed, int data_bits, char parity, int stop_bits)
{
    struct termios comConfig;
    int baud_rate;

    if (tcgetattr(fd, &comConfig) < 0)
    {
        printf("%s tcgetattr\n",strerror(errno));
        return -1;
    }

    cfmakeraw(&comConfig);
    comConfig.c_cflag &= ~CSIZE;

    switch(_speed)
    {
    case 2400:baud_rate = B2400;break;
    case 4800:baud_rate = B4800;break;
    case 9600:baud_rate = B9600;break;
    case 19200:baud_rate = B38400;break;
    default:
        baud_rate = B115200;
    }

    cfsetispeed(&comConfig,baud_rate);
    cfsetospeed(&comConfig,baud_rate);

    switch(data_bits)
    {
    case 7:comConfig.c_cflag |= CS7;break;
    default:
        comConfig.c_cflag |= CS8;
    }

    switch(parity)
    {

    case 'o':
    case 'O':
    {
        comConfig.c_cflag |= (PARENB|PARODD);
        comConfig.c_iflag |= INPCK;
    }break;
    case 'e':
    case 'E':
    {
        comConfig.c_cflag |= PARENB;
        comConfig.c_cflag &= ~ PARODD;
        comConfig.c_iflag |= INPCK;
    }break;
    default:
        comConfig.c_cflag &= ~PARENB;
    }

    switch(stop_bits)
    {
    case 1:
        comConfig.c_cflag &= ~CSTOPB;break;
    default:
        comConfig.c_cflag |= CSTOPB;
    }

    comConfig.c_cc[VTIME] = 0;
    comConfig.c_cc[VMIN] = 1;

    tcflush(fd,TCIFLUSH);

    if (tcsetattr(fd,TCSANOW,&comConfig) != 0)
    {
        printf("%s  tcsetattr\n",strerror(errno));
        return -1;
    }
    return 0;
}


#endif // SETCOMCONFIG_H



你可能感兴趣的:(编程,linux,struct,kill,bash,终端)