我一直在尝试用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/