Linux termios参数解释

时间:2014-04-09 14:29:31

标签: c linux uart termios

我一直在尝试使用Linux(Debian Wheezy)操作系统在Olimex A13机器上设置串口。要设置参数以设置UART,我使用 termios 结构。在我的情况下,我只是设置一个parameter = value如下...

options.c_cflag = (CLOCAL | CREAD);

我还在互联网上看到了如下代码示例代码......

tcgetattr(fd, &options);

cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~( ICANON | ECHO | ECHOE |ISIG );
options.c_iflag &= ~(IXON | IXOFF | IXANY );
options.c_oflag &= ~OPOST;

tcsetattr(fd, TCSANOW, &options);

在上面的例子中,参数赋值看起来像是使用逐位运算符来设置参数 我的问题是,如何解释上述作业?

例如:     怎么样......

options.c_cflag |= (CLOCAL | CREAD);

解释与...相比。

options.c_cflag = (CLOCAL | CREAD);   

???

同样的:     怎么样......

options.c_cflag &= ~PARENB;  

解释与...相比

options.c_cflag = ~PARENB;   

???

termios标志是否真的是一组位,其中参数对应于标志中的特定位位置?
由于这些值是由参数设置的(即CLOCAL,CREAD),因此在将flag =设置为参数时,位操作符是多余的?
如果有人能澄清这一点我会非常感激。

2 个答案:

答案 0 :(得分:1)

termios位确实是在unsigned intstruct termios设置的位(至少在Linux上)。它们在/usr/include/<platform>/bits/termios.h中定义。

  

如何... options.c_cflag | =(CLOCAL | CREAD); ...解释比较... options.c_cflag =(CLOCAL | CREAD);

|= (CLOCAL | CREAD)会将所请求的termios位设置为已存在的位,而= (CLOCAL | CREAD)仅设置您请求将其他所有位重置为零的位(这是完全错误的最有可能的是因为它会将字符大小设置为5位(CS5)。

c_cflag &= ~PARENB;options.c_cflag = ~PARENB相同。前者只将 PARENB标志设置为零,后者将所有位设置为1,但PARENB标志除外为零 - 我认为这不是理想的结果。

答案 1 :(得分:0)

options.c_cflag =〜PARENB;

options.c_cflag | =〜PARENB; //因此它将是唯一的真实