我一直在尝试使用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 =
设置为参数时,位操作符是多余的?
如果有人能澄清这一点我会非常感激。
答案 0 :(得分:1)
termios位确实是在unsigned int
上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
标志除外为零 - 我认为这不是理想的结果。
答案 1 :(得分:0)
options.c_cflag =〜PARENB;
options.c_cflag | =〜PARENB; //因此它将是唯一的真实