我一直试图用Linux (Debian )操作系统在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 =
设置为参数时,是否存在位明智操作符?
如果有人能澄清这一点,我将非常感激。
发布于 2014-04-09 14:57:12
termios位确实是设置在unsigned int
和struct termios
上的位(至少在Linux上是这样)。它们是在/usr/include/<platform>/bits/termios.h
中定义的。
怎么样..。options.c_cflag |= (CLOCAL \ CREAD);...interpretedoptions.c_cflag = (CLOCAL _ CREAD);
|= (CLOCAL | CREAD)
将将请求的termios位设置为已经存在的位,而= (CLOCAL | CREAD)
只将请求的位设置为零(这很可能是错误的,因为它将字符大小设置为5位(CS5) )。
c_cflag &= ~PARENB;
与options.c_cflag = ~PARENB
的对抗也是如此。前者只将PARENB
标志设置为零,而后者则将所有位设置为1,但PARENB
标志将被设置为零--我认为这不是期望的结果。
发布于 2020-01-16 10:51:15
options.c_cflag = ~PARENB;
options.c_cflag |= ~PARENB;//这将是唯一的真理
https://stackoverflow.com/questions/22965725
复制相似问题