이 글은 http://www.best-microcontroller-projects.com/how-rs232-works.html 내용을 무단!으로 번역한 글입니다. 영어 연습차원에서 번역한 글이라서 번역이 정확하지 않습니다
이 문서는 물리적인 레벨에서 RS232가 어떻게 동작하는지 설명한다. 이를 통해서 마이크로 컨트롤러 핀에서 나오는 신호의 의미를 이해할 수 있을 것이다.
RS232란 뭘까?
이것은 적은 수의 선을 이용해서 2개의 장치간에 데이터를 주고 받는 방법(또는 프로토콜)에 대한 내용이다. RS232는 하나의 신호 선을 이용해서 한 비트씩 시리얼 전송을 할때 사용된다.
데이터는 오직 한방향으로만 전송될 수 있기 때문에 양방향 통신을 하기 위해서는 2개의 선이 필요하게 된다.
2개의 선은 그라운드 선과 같이 묶여서 동작하기 때문에 동작을 위한 최소한의 선의 개수는 3가닥이 필요 하게 된다.
노트: 긴 거리에서 더 신뢰성있는 통신을 하기위해서는 RS232표준에 정의되어 있는 DTR DCT같은 다른 커넥션 핀들이 필요할 것이다.
더 명확하게 말하자면 RS232는 전자 장비간 데이터를 전송하는 비동기 커뮤니케이션 프로토콜이다.
기본적으로 이것은 3 ~ 22개의 선을 이용해서 100 에서 20k baud의 속도로 하나의 바이트를 전송할 수 있다. 일반적으로 사용되는 baud rate는 2400kbps, 9600kbps, 19200kbps이다. 케이블의 길이는 최대 50ft까지 가능하다. 더 높은 baud rate(38400, 57600)는 동작은 가능하지만 표준에서 지정한 스펙을 보장할 수 없다.
데이터 블럭의 바이트들을 전송하기 위해서는 한 바이트씩 전송해야 한다.
RS232는 어떻게 동작하는가
이 문세에서는 어떻게 RS232가 복잡한 핸드쉐이크 방법없이 동작하는지 설명한다. 오직 가장 단순한 시스템만을 설명할것이다. 이 방식은 가장 유용하고 많이 쓰이는 방식이다.
데이터는 두가닥의 선을 통해서 각각 한 방향으로 시리얼 전송된다. 밖으로 전송되는 신호선은 Tx라고 불린다. 데이터가 들어오는 신호선은 Rx라고 부른다. 양방향 통신 시스템을 구축하기위한 최소한의 선은 Tx,Rx,GND로 3가닥이다. 반대편에 있는 시스템와 데이터를 주고 받기 위해서는 Tx, Rx선을 서로 교차로 연결시켜야 한다.
이전 바이트가 전송된 이후라면 다음 바이트는 언제든지 전송될 수 있다. 전송된 바이트는 수신지와 동기화 되지 않는다. 이것은 비공기 프로토콜이다. 따라서 clock 신호선이 없다. 이런 이유로 각각의 시리얼 디코딩 칩들이 시리얼 데이터 스트림을 디코딩할 수 있도록 양단의 소프트웨어는 정확하게 같은 설정으로 동작해야 한다.
RS232는 어떻게 동작하는가 : Baud
이것은 간단하게 말하자면 초당 비트수 단위의 전송 속도이다. 이것은 각각의 비트 주기의 frequency를 정의한다.
2400 baud rate에서 주파수는 2400Hz이다. 비트 주기는 1/2400 또는 416.6us가 된다. 이 정보는 리시버가 데이터 스트림으로 부터 비트를 복원하기 위한 정보이다.
RS232는 어떻게 동작하는가 : 전압 레벨
트렌스미터
RS232는 데이터 비트 스트림 전송을 전송할 때 어떻게 동작하는가
긴 케이블을 통해도 동작하게 하려면 케이블의 저항이 전압을 낮추기 때문에 고 전압으로 전송해야 멀리 전송이 된다. 출력 전압 사양은 +5 에서 +25 (논리적으로 0) 과 -5V 에서 -25V(논리적으로 1)이다.
노트 : 케이블 상의 모든 신호는 같은 전압 레벨로 동작해야 한다.(e.g DTR, DSR, RTS, CRS) 따라서 RS232 모든 시그널을 구현하기 위해서는 많은 레벨 변환 칩이 필요하다 하지만 짧은 구간에서만 사용할 거라면 Tx,Rx,GND만 구현하면 된다.
리시버는 최소 ±3V만 되면 시그널을 처리할 수 있다.
최대 전압인 ±25V는 일반적으로 사용되지 않으며 보통 ±12V가 사용된다.(MAX232 트렌시버 칩의 출력 전압이다)
논리 1은 -12V로 전송되며 논리 0은 +12V로 전송된다. 일반적인 논리 형식과 반대로 뒤집혀있다.
노트 : 높은 전압을 가지는 시리얼 포트가 장치에 전력을 공급할 수 있을 거라고 기대할 수 있지만, 해당 장치들은 매우 적은 전류만 소비해야 한다.(?)
리시버
RS232는 데이터 비트 스트림 전송을 수신할 때 어떻게 동작하는가
리시버에서 입력 전압 레벨이 ±3V으로 정의되어 있다면, 논리 0은 반드시 3V보다 커야 하고 논리 1은 반드시 -3V보다 작아야 한다. 이런 방식은 노이즈가 발생하거나 선 길이에 따른 전압 강하가 발생하는 것을 허용한다. ±3V 레벨 까지의 노이즈들은 리시버에게 영향을 주지 않는다.
RS232는 어떻게 동작하는가 : 비트 스트림
RS232는 어떻게 동작하는가 – 시작 비트
이 프로토톨은 비동기로 구현되어 있기 때문에 전송할 때 어떠한 클럭 신호도 보내지 않는다. 대신에 다른 방식의 클럭 복원 방식이 사용된다.
리시버에게 바이트 데이터가 전송될 것이라는 것을 알려주기 위해서 각각의 전송은 시작 비트를 전송하는 것으로 시작한다.
시작 비트는 리시버가 데이터 비트를 동기화 하도록 한다. 리시버가 각각의 비트의 중간점을 샘플링 하기 위한 자신만의 클럭을 생성할 수 있는게 해준다. 리시버는 초기화 프로세스 과정에서 샘플링 주기가 설정되므로 스타트 비트만 한번 찾으면 나머지 비트들을 알 수 있게 된다.
RS232는 어떻게 동작하는가? – 데이터 비트
데이터 비트는 스타트 비트 뒤에 온다. LSB가 첫번째로 전송되는 걸로 시작해서 7개 또는 8개 데이터 비트가 전송된다. 7비트 또는 8비트중 하나는 선택하게 된 이유는 ASCII 코드에서 알파벳을 표현하기 위해서는 7비트만 있어도 가능하기 때문이다.
만약 당신이 텍스트만 전송하고자 한다면 7비트만 있어도 된다. 7비트를 사용하게 되면 대량의 데이터를 전송할 때 전송 속도를 증가시킬 수 있다. 다른 데이터 비트 크기로는 5비트 또는 6비트가 있다. 하지만 일반적으로 비트 길이 설정 옵션은 무시되며 대부분은 8비트 전송 모드를 사용한다.
노트 : 만약 당신이 RS232를 통해서 raw data(binary data)를 전송하고자 한다면 8비트 데이터 비트를 사용해야 한다.
RS232는 어떻게 동작하는가? – 패리티 비트
패리티 비트는 기초적인 전송 에러 검출 메커니즘이다. 홀수 패리티 또는 짝수 패리티를 사용하거나 아예 사용하지 않을 수도 있다.( 이경우 패리티 비트가 전송되지 않는다)
패리티 원리는 아주 간단하다. 모든 데이터 비트를 평가해서 만약 홀수개의 비트가 1이라면 홀수 패리티는 1이 된다. 반대로 데이터 짝수개의 데이터 비트가 1이라면 짝수 패리티가 1이 된다.
리시버 입장에서는 패리티 비트가 전송 도중에 에러가 발생했는지 알 수 있는 용도로 사용된다. 리시버 소프트웨어가 UART 모듈에 있는 flag를 확인하면 된다.
문제는 전송 도중에 2개의 비트가 동시에 에러가 발생할 경우 패리티 비트를 이용안 에러 검출이 안된다는 점이다. 왜냐하면 각각의 에러는 다른 에러를 상쇄시키는 효과가 발생하기 때문이다. 짝수개의 비트에서 에러가 발생하게 된다면 에러 검출은 실패하게 된다.
책상위에서 동작하는 시스템에서는 심각한 데이터 전송 오류가 발생되지 않기 때문에 이것은 문제가 되지 않는다. 짧은 케이블 거리에서는 아마도 전혀 에러를 만나지 못할것이다. 일반적으로 no parity 로 데이터 전송을 해도 전혀 문제가 없다.
긴 거리를 관통하는 시스템이나 노이즈가 심한 환경에서의 시스템에서는 패리티 체크보다 더 좋은 방법을 사용해야 한다. 예를 들면 CRC체크를 데이터 스트림을 주고 받을 때 같이 첨부하는 것이다. CRC는 에러 체크를 해줄 뿐만 아니라 데이터를 재전송하지 않고도 약간의 에러는 정정해준다.
RS232는 어떻게 동작하는가? – 스톱 비트
스톱 비트는 단지 다음 시작 비트가 전송 될 수 있도록 시간을 좀 벌어주는 역활만 한다. 스톱 비트는 스타트 비트의 반대 개념이다.
만약 스톱 비트가 없다면 마지막 비트는 패리티 비트가 된다.(패리티 비트를 사용하지 안으면 데이터 비트가 된다)
스톱 비트는 1, 1.5, 2비트 주기 중에 하나를 선택할 수 있다.
RS232는 어떻게 동작하는가 : 일반적인 설정
데스크탑에서 보통 사용하는 환경(예를 들면 마이크로컨트롤러 와 하이퍼터미널)에서의 일반적인 설정은 아래와 같다.
일반적인 Baud rate 설정
Baud 9600
Data bits 8
Parity None
Stop bits 1
Flow Control None
하드웨어 연결은 3핀만 한다(Rx, Tx, GND) – Rx 와 Tx는 서로 크로스 한다.
신호 : 신호 레벨에서 RS232는 어떻게 동작하는가
남은 핀을 이용하거나 제공 받은 라이브러리가 동작하지 않거나 하드웨어 로직을 아끼고 싶다 던 지 등등 여러 이유로 인해서 소프트웨어 UART를 만들고 싶을 수 도 있을 것이다.
노트 : 소프트웨어 USART 코드는 여기서 찾을 수 있다.
당신이 필요하는 실제 시그널 다이어그램을 만들기 위해서는 마이크로 컨트롤러 핀을 살펴보는게 좋다.(이상하게 웹에서는 찾기가 힘들다)
아래 다이어그램은 마이크로 컨트롤러의 출력핀에서 0-5V 로직 비트 스트림을 생성해서 RS232가 어떻게 동작하는지 보여주고 있다.