2014-04-09 4 views
2

나는 Linux (Debian Wheezy) 운영 체제를 사용하여 Olimex A13 시스템에 직렬 포트를 설정하려고 시도해 왔습니다. UART를 설정하기위한 매개 변수를 설정하려면 termios 구조를 사용하고 있습니다. 내 경우에는 내가 단순히 다음과 같은 parameter = value ... 나는 또한 위의 경우 다음 ...리눅스 termios 매개 변수 해석

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 = (CLOCAL | CREAD); 

???

그리고에 대해 동일한

: 이 어떻게 ...
options.c_cflag &= ~PARENB; 

가 비교 해석 ...

options.c_cflag = ~PARENB; 

???

실제로 termios 플래그는 플래그가 플래그의 특정 비트 위치에 해당하는 비트 세트입니까?
flag =을 매개 변수로 설정할 때 이러한 값이 매개 변수 (예 : CLOCAL, CREAD)에 의해 설정되므로 비트 연산자가 중복됩니까?
누군가가 이것을 분명히 할 수 있다면 크게 감사하겠습니다.

+0

[POSIX 운영 체제 용 직렬 프로그래밍 안내서] (http://www.cmrr.umn.edu/~strupp/serial).html # 3_1_3) : * "c_cflag (또는 다른 플래그) 멤버를 직접 초기화하지 마십시오. 비트 AND, OR 및 NOT 연산자를 사용하여 멤버의 비트를 설정하거나 지우는 것이 좋습니다.) 비트를 다르게 사용할 수 있기 때문에 비트 연산자를 사용하면 최신 직렬 드라이버에 필요한 비트 플래그가 손상되지 않습니다. "* – sawdust

+0

방어 프로그래밍에서는 항상 모든 시스템의 반환 코드를 확인해야한다고 가르쳐 왔습니다. 가능한 오류에 대해서는 ** tc [gs] etattr() **와 같은 "사소한"심지어 호출도 포함합니다. 너무 많은 자습서에서는 예제를 더 쉽게 읽을 수 있도록이 체크를 남깁니다. 그러나 읽기 쉬운 것은 무엇이든 일어날 수있는 실제 프로그래밍에 적합하지 않습니다. 이 [샘플 코드] (http://stackoverflow.com/questions/12437593/how-to-read-a-binary-data-over-serial-terminal-in-c-program/12457195#12457195)를 살펴보십시오. – sawdust

+0

[터미널 모드를 올바르게 설정하는 방법] (http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html#SEC237) – sawdust

답변

1

termios 비트는 실제로는 struct termios (적어도 Linux의 경우)으로 설정됩니다. 그들은 /usr/include/<platform>/bits/termios.h에 정의되어 있습니다.

어떻게 ... options.c_cflag | = (CLOCAL | CREAD); ...와 비교되는 해석 ... options.c_cflag = (CLOCAL | CREAD); 그것은 예를 들어, 문자 크기 설정 때문에 = (CLOCAL | CREAD) 당신이 가장 가능성이 명백히 잘못 제로에 다른 모든 (재설정 요청 비트를 설정합니다 동안

|= (CLOCAL | CREAD)는 추가로이 이미 무엇을 요구 termios의 비트를 설정합니다 5 비트 (CS5)에 관한 것이다.

options.c_cflag = ~PARENB 대해 c_cflag &= ~PARENB;와 동일. 전자는 PARENB 플래그 제로로 설정되지만, 후자는 012을 제외하고 1 모든 비트 설정할 것이다플래그가 0으로 설정됩니다. 원하는 결과가 아닌 것 같습니다.