1

我一直在尝试在装有 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 =参数时,位操作符是多余的吗?
如果有人能澄清这一点,我将不胜感激。

4

2 回答 2

3

termios 位确实是在unsigned inta中设置的位struct 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将设置为零的标志除外 - 我认为这不是预期的结果。

于 2014-04-09T14:57:12.583 回答
0

options.c_cflag = ~PARENB;

options.c_cflag |= ~PARENB; // 所以这将是唯一的真实

于 2020-01-16T10:51:15.250 回答