我一直在尝试用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 =设置为参数时,按位运算符是否多余?
如果有人能澄清这一点,我将不胜感激。

最佳答案

termios位实际上是在withina上设置的位(至少在linux上)。它们在unsigned int中定义。
怎么样…options.c_cflag=(clocal cread);…与…options.c_cflag=(clocal cread);
struct termios将另外将请求的termios位设置为已经存在的位,而/usr/include/<platform>/bits/termios.h将只设置您请求的位,将所有其他位重置为零(这显然是错误的,因为它将设置字符大小为5位(cs5))。
|= (CLOCAL | CREAD)= (CLOCAL | CREAD)相同。前者只将c_cflag &= ~PARENB;标志设置为零,而后者将除options.c_cflag = ~PARENB标志设置为零之外的所有位设置为1-我不认为这是期望的结果。

关于c - Linux termios参数解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22965725/

10-10 00:34