start bit

rs232c 통신은 비동기(async) 통신 방식입니다. 즉, 상대방과 내가 통신 라인으로 연결되어 있지만 언제 상대방으로부터 데이터가 전송되어 올지 모릅니다. 예를 들어서 통신 라인에 전압이 0.8v 미만일 때에는 비트 값을 0 으로, 2.4v 이상이면 비트 값을 1로 읽어 들인다고 하겠습니다. 통신 라인을 연결하고 전압을 읽어 보면 0.8v 미만으로 떨어져 있다고 하겠습니다.

이때, 이 값을 상대가 보낸 bit값 0 일가요? 아니면 그냥 연결된 상태 일까요? 아마 둘 중에 하나 일것입니다. 비동기 방식은 이와 같은 문제를 해결하기 위해 데이터를 전송하기 전에 미리 start bit를 보내고 데이터 bit를 전송하게 됩니다.

즉, start bit는 데이터 전송의 시작을 알려 주는 비트가 되겠습니다.

동기(sync)통신은 평상 시에도 동기 신호를 주고 받기 때문에 따로 start bit를 전송하거나 기다릴 필요가 없습니다. 바로 자료를 전송하고 수신 받을 수 잇기 때문에 통신 속도가 빠릅니다. 그러나 하드웨어 구성하는 것이 어렵고 비용이 든다고 하네요.

 

stop bit

stop bit는 이제 데이터 비트를 모두 전송했다라는 뜻의 비트값이 되겟습니다. 또한 stop bit는 한개의 비트로 표현할지, 아니면 2개의 비트로 표현할지를 결정할 수 있는데, 대부분 1 stop bit를 사용합니다.

이와 같이 start bit와 stop bit는 시리얼 통신의 특성 중 하나입니다. 전송되는 데이터 bit 가 8 bit로 설정되어 있어도 실제로는,

[start bit + data bit + stop bit] + [start bit +data bit+stop bit] + ....

이런 모습으로 주고 받게 됩니다.

 

stop bit 설정

start bit는 반드시 사용하므로 프로그램에서는 따로 설정할 것이 없습니다. 대신에 stop bit에 대해서는 1 stop bit를 사용할지 2 stop 비트를 사용할지를 지정합니다.

이전 시간 까지는 (1) 시리얼 포트를 open 하고 (2) 통신 속도를 지정하는 것까지 말씀 드렸습니다. 이번 시간에는 (3) 가장 많이 사용하는 1 stop 비트 설정을 예로 보여 드리고 싶은데, 기본 값이 1 stop bit라 따로 지정할 것이 없습니다. 대신에 2 stop bit 를 사용할 경우의 예를 대신 하겠습니다.

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 | RS_2_STOP_BIT;          <-- 생략하면 1 stop bit
   tcflush (fd, TCIFLUSH );
   tcsetattr(fd, TCSANOW, &newtio );

   close( fd);                                      
   return 0;
}

간단하죠. 다음 시간에는 parity 와 data bit 사이즈에 대해서 설명해 드리겠습니다.