나는 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)에 의해 설정되므로 비트 연산자가 중복됩니까?
누군가가 이것을 분명히 할 수 있다면 크게 감사하겠습니다.
[POSIX 운영 체제 용 직렬 프로그래밍 안내서] (http://www.cmrr.umn.edu/~strupp/serial).html # 3_1_3) : * "c_cflag (또는 다른 플래그) 멤버를 직접 초기화하지 마십시오. 비트 AND, OR 및 NOT 연산자를 사용하여 멤버의 비트를 설정하거나 지우는 것이 좋습니다.) 비트를 다르게 사용할 수 있기 때문에 비트 연산자를 사용하면 최신 직렬 드라이버에 필요한 비트 플래그가 손상되지 않습니다. "* – sawdust
방어 프로그래밍에서는 항상 모든 시스템의 반환 코드를 확인해야한다고 가르쳐 왔습니다. 가능한 오류에 대해서는 ** tc [gs] etattr() **와 같은 "사소한"심지어 호출도 포함합니다. 너무 많은 자습서에서는 예제를 더 쉽게 읽을 수 있도록이 체크를 남깁니다. 그러나 읽기 쉬운 것은 무엇이든 일어날 수있는 실제 프로그래밍에 적합하지 않습니다. 이 [샘플 코드] (http://stackoverflow.com/questions/12437593/how-to-read-a-binary-data-over-serial-terminal-in-c-program/12457195#12457195)를 살펴보십시오. – sawdust
[터미널 모드를 올바르게 설정하는 방법] (http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html#SEC237) – sawdust