data bit size

  컴퓨터에서 사용하는 데이터는 1 byte, 8bit를 사용하지만 통신 속도가 느린 시리얼 통신이다 보니 조금이나마 빠르게 통신을 하기 위해 data bit size를 설정하는 것이 있습니다. 예로 영문 ASCII만 사용한다면 굳이 8bit 모두를 주고 받을 필요가 없겠죠. 해서 이럴 때에는 data bit size를 7 bit로 설정합니다.

  또는 주고 받는 데이터가 숫자만 사용한다면 4bit로 대문자 영문 알파벳만 사용한다면 5bit로 주고 받을 수도 있겠습니다. 그러나 이것은 특이한 경우이고 바이너리 데이터나 한글도 주고 받아야 하기 때문에 보통 8bit 를 사용합니다.

 data bit size로 지정하는 상수가 미리 정의되어 있습니다.

data bit size
상수
5 CS5
6 CS6
7 CS7
8 CS8

parity

  parity는 바이트 별로 제대로 수신했는지 확인하는데 사용합니다. parity를 확인하는 방법에는 여러 가지가 있습니다만 예로 even parity를 소개하겠습니다. even parity로 적으면 이해가 어렵습니다만 우리 말로 "짝수 패리티"로 번역해 놓으면 이해가 쉽습니다.  전송하는 데이터 비트 중 1 인 비트를 세어서 짝수 개수이면 뒤에 0 bit를 추가하고 홀수이면 1의 개수가 짝수가 되도록 1 bit를 추가해서 보내 주는 것이 짝수 패리티입니다.

  다시 말씀드려 전송하려는 데이터의 bit 값이 100101 이라면, 1의 개수가 3개라서 홀수입니다. 그러므로 1의 개수를 짝수로 만들기 위해 뒤에 1을 추가하여 전송합니다. 즉, 100101(1)을 보낸다는 것이죠. 100100이면 100100(0) 으로 보내 겠지요. 수신 쪽은 1의 개수를 확인해서 짝수인지 홀수인지를 확인하고 수신한 data bit가 제대로 수신했는지를 확인할 수 있습니다. 홀수 패리티를 사용한다면 반대로 패리티 값이 결정되서 전송되겠죠.

  그러나 패리티를 이용해서 수신 데이터가 이상한 것은 알 수 있어도 어느 비트에 이상이 있는지를 확인할 수가 없습니다. 이런 이유로 보통 사용하지 않습니다. 모든 바이트를 일일이 확인하는 대신에 프로토콜에 아예 체크 바이트를 따로 두고, 전체적으로 확인하는 방법을 사용합니다.

c_iflag
패리티 설정
newtio.c_cflag = PARODD | PARENB 홀수 패리티 사용
newtio.c_cflag = PARENB 짝수 패리티 사용
newtio.c_cflag = 0 패리티 없음

PARODD와 PARENB는 termios.h 에 정의되어 있으며 각각의 값은 아래와 같습니다.

패리티
상수 값
PARODD 512
PARENB 256


data bit size 와 parity 적용

  역시 termio 구조체를 이용합니다.

int main( void)
{
   int     fd;  
   struct termios newtio;

   fd = open( "/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK );

   memset( &newtio, 0, sizeof(newtio) );
   newtio.c_cflag = B115200;
   newtio.c_cflag |= CS8;               // 데이터 비트가 8bit, 패리티 없음

   // 만일 홀 수 패리티라면 newtio.c_cflag |= CS8 | PARODD | PARENB;

   newtio.c_iflag = IGNPAR;            // 패리티 오류 무시
   tcflush (fd, TCIFLUSH );
   tcsetattr(fd, TCSANOW, &newtio );

   close( fd);
   return 0;
}

 

태그:*시리얼 *serial *통신