:: 진공에 대해 알려주마.

RS-232 시리얼 통신 본문

진공/노하우

RS-232 시리얼 통신

하이백 2019. 12. 8. 12:52

RS-232 시리얼 통신

우리가 RS-232 통신에 대해서 관심을 갖는 이유는 가장 간단한 구조이며 손쉽게 하드웨어를 구성할 수 있는 장점이 있어서가 아닌가 한다.

자세한 이론은 잘 정리된 것이 많다. 이 페이지 맨 아래에 링크를 참고하시기 바란다.

데스크톱 PC에는 기본 설치되어 있으며 (USB Port로 대체되어가고 있기는 하지만..) 노트북 PC에는 저렴한  Converter를 설치하여 통신을 시도해 볼 수 있다. 무엇보다도 기존의 많은 장치들이 RS-232 시리얼 통신을 지원한다는 것이다.  

PC 메인보드에 D-Sub 9Pin Connector가 RS-232 시리얼 포트이다.

 

쉽게 구할 수 있는 D-SUB Connector와 세 가닥의 케이블만 있으면 PC끼리 아니면 PC와 컨트롤러와 바로 통신이 가능하기 때문이다. 지금은 다른 통신 방식의 발전으로 통신 방식의 전환이 빠르게 진행되고 있으나 아직도 많은 선택을 받고 있다.

통신을 하고자 하는 장치가 RS-232 시리얼 통신을 지원하면 간단히 케이블을 구성하여 통신을 시도해 볼 수 있다.

이 케이블로 PC끼리 연결하면 바로 채팅이 가능하다. (Feat. 하이퍼터미널)

 

시리얼통신이라는 말 자체에서 보듯이 시리얼 포트와 케이블만 있으면 통신이 가능하다. 두대의 PC를 위의 케이블로 연결하고 포트를 오픈하면 문자를 전송과 수신이 가능하다. 이때는 주종 혹은 서버 클라이언트 관계가 아니라 1:1 방식의 통신이 가능하다. 이 방식을 빌려와 장치에 적용하여 사용하는 것이다. 

채팅은 결과 사람과 사람이 문자를 이용하여 정보를 주고받는 것이다. 하지만 사람이 아닌 장치에게 정보를 얻기 위해서는 장치에 미리 지정된 정보를 설치하고 사람은 지정된 절차에 따라 장치의 정보를 얻을 수 있다.

반도체 디스플레이 설비에서 모든 장치를 PC에서 제어하기는 불가능하다. 설비마다 수십, 수백의 장치가 사용되며 이러한 장치는 각각 동작할 수 있도록 명령만 내려야 한다.

장치에 "문열어" 하고 통신으로 명령만 전달하면 된다. 그렇지 않은 경우 "Lock 풀어", "실린더에 공압 투입", "센서 동작확인", "실린더 공압 정지" 등 이런 명령들을 하나하나 제어하다 보면 엄청나게 많은 문제가 부딪칠 것이다. PC가 집적 장치를 제어하지 않아도 컨트롤러가 제어를 하고 PC는 컨트롤러와 필요한 정보나 데이터만 주고받으면 된다. 이러한 이유로 통신이 필요하게 되며 이에 가장 흔하고 쉬운 방식이 시리얼 통신이다.

쉽게 표현하면 대리점을 두고 모든 소매상은 대리점을 통해 거래하고 PC는 대리점과 관리하면 되고 이 관리 수단으로 통신을 사용한다. 이러한 경우 대리점이 이해할 수 있는 언어로 정보를 주고받아야 한다. 대리점이 서버 역할을 하고 내가 대리점에 정보를 얻는 클라이언트가 되는 것이다.

장치와 시리얼 통신을 해야 하는 경우는 여러 가지가 있겠지만 보다 쉽게 하드웨어의 정보를 가져오기 위한 수단이다. 시리얼 통신(RS-232)은 point to point 통신 방식이다. RS-232 포트 하나에 하나의 장치만 연결이 된다. 

점대점 통신방식 (POINT TO POINT)

위의 사진 중 PC에서 설치되어 있는 D-Sub 9 pin 커넥터가 보인다면 그것이 시리얼 통신을 위한 통신 포트이다. 요즘은 시리얼 통신 포트가 없어지는 추세로 가장 많이 사용되는 USB 포트를 RS-232 통신 방식으로 변환해 주는 하드웨어를 쉽게 구할 수 있다. 뿐만 아니라 USB에서 RS422, 485도 변환해 주는 컨버터도 많은 종류를 구할 수 있다. 

RS-232 통신의 주로 D-SUB 9핀 커넥터를 사용한다. 물론 GPIB, 15핀, 25핀 D-Sub 커넥터 포트로 시리얼 통신을 제공되는 장치도 많다. 

 

9핀 D-Sub의 경우 2,3,5번 핀이 각각 Tx, Rx, GND이다. 반이중 전송 방식(Half Duplex)을 사용한다. RS-232 통신은 GND 신호를 Tx와 Rx가 같이 사용하므로 항상 한쪽에서만 전달이 가능하다.

RS-232 통신은 통신하고자 하는 장치를 서버로 보고 나를 클라이언트로 두고 프로그래밍하면 된다. 즉 내가 묻고 장치가 물음에 회신하는 방식이다. 제대로 통신을 하기 위해서는 몇 가지 규격을 가지게 된다.

서버(통신을 하고자 하는 장치)가 원하는 통신 규격을 내 PC의 시리얼 포트에 설정하고 서버에게 정해진 명령 중 필요한 것을 송신하면 서버는 정해진 규칙에 따라 회신하는 방식이다. 여기서 통신 규격이란 Baud rate, Parity bit, data bit, Stop bit로 구성된 설정값을 말한다.

어떠한 통신 방식을 사용하더라도 장치와의 통신은 서버, 클라이언트 방식을 사용한다. 따라서 서버에 접속하는 방법과 서버에 전송할 명령을 우선 파악해야 한다. 이는 사용할 장치 매뉴얼을 참고하여 확인하여야 한다.

통신 프로그램 혹은 통신 드라이버 프로그램을 만든다면 아래의 내용을 미리 확인하고 시도하면 빠르고 쉽게 제작할 수 있을 것이다.

 

"9600N81"

RS-232 통신에서 가장 많이 사용되는(사용되었던) 통신규격(Protocol)  9600, N,8,1의 의미는 다음과 같다.

9600

Baud rate라 하며 데이터를 초당 9600 bit씩 전송하겠다는 의미로 통신 포트에 설정하는 것이다. 이후 통신 포트는 송수신 신호를 0.00010417초(104 µs)에 한 비트씩 처리하여 정해진 bit의 묶음인 packet을 주고받을 것이다. 한 개의 비트는 5 볼트 이상의 값을 104 µs 동안 켰다가 끄면 1로 인식한다는 뜻이기도 하다.

반대편 PC 혹은 장치도 똑같은 값으로 설정이 되어 있어야 한다. 그래서 신호를 정해진 시간마다(104 µs) 인식한 voltage로 0과 1을 판단할 것이다.

만일 두 개의 장치가 서로 다른 baud rate을 설정했다면 서로 시간마다 인식하는 전압이 다르므로 전혀 다른 언어로 이야기하는 것과 같게 된다. 

NONE Parity bit, 8 Data bit, 1 Stop bit

N,8,1의 의미는 패리티 비트는 없고 데이터 비트는 8, 스톱 비트는 1로 총 9개의 비트가 한문자를 표현한다는 뜻이다. 여기에 표시는 안 하지만 시작 비트 1개를 더해 총 10개의 비트가 한문자를 표현하게 된다. 한문자가 10개의 비트로 구성되면 초당 960 문자를 주고받을 수 있다는 뜻이다.

장치에서는 104 µs 시간 간격으로 전압을 10회 측정하여 시작 비트(Start bit), 종료 비트(1 Stop bit)를 버리고 8개의 비트로 ASCII 테이블에 대입해 문자를 확인하게 된다.

"A" ASCII 테이블에서 보면 숫자 65이며 이를 16진수로 변환하면 41이고 이를 이진수로 환산하면 0100 0001 이 된다. 여기에 시작 비트와 스톱 비트를 더하면 실제 전송되는 비트는 다음과 같다. 

"A" = 65 = 0x41 = 0100 0001 
문자"A"는 십진수로 65, 16진수로 41이고 이진수로는 01000001이다.
비트 전송은 오른쪽 비트에서 왼쪽 비트 순으로 전송된다. 실제 전송되는 비트는 순서는 10000010
여기에 앞에 Start bit를 뒤에 Stop bit를 추가한다.  0 + 10000010 + 1
하드웨어를 거쳐 외부로 전송되는 비트는 inversion과정을 거친다.  1 + 01111101 + 0
1011111010

"A"를 전송하면 다음과 같이 보일 것이다. 아래 이미지는 손으로 그림것이다. 참고만 하시고 실제 파형은 더 아래쪽에 첨부 하였다. 

핸드메이드 파형 (아스키 문자 "A")

 


 

이번에 RS-232 통신을 하면서 물 건너온 장치 하나가 TTL 통신을 한다. 이를 해결하면서 ASCII Code를 다시 보고 오실로스코프를 찍어 보면서 문제가 생겼다. 위에 손으로 작성한 스코프 영상이 실제와 전혀 다른 것이다. 옛날에 다 알던 내용인데...  다시 찾아봐야겠다. 

 

한 가지 문제 발생하여 일부 내용을 수정한다. 내용은 아래와 같다.
문제는 신호가 반전되어 나가는 원인을 알지 못한 것이다. 전에는 당연히 그런다 보다 했는데 원인을 찾느라 시간을 많이 소비하였다. 
이유는 당연히 그렇게 되는 것이었다. 하드웨어가 UART에서 외부로 전송하는 과정에서 inversion 하는 것이다.

아래 이미지는 ASCII Code "C"를 모니터링한 것이다.
C = 0x43 = 0100 0011이다.
여기세 RS232 규격의 start bit와 stop bit를 추가하여 전송한다.

문제는 여기서 실제 RS-232 라인으로 보내지는 시점에서 반전이 발생한다. 0은 1로, 1은 0으로 변환한다. 이 이유를 몰랐다. 

전문가에게 물었더니 아래와 같은 문서를 보내 주었다. PC내부의 UART line과 실제 전송되는 RS232 Line의 사이에 inversion이 된다고 한다. 
https://www.anticyclone-systems.co.uk/rs232.php

 

결론
위에 문자 C를 보내려면
Start bit = 0
Data bit = 1100 0010 (LSB부터 보냄)
Stop bit = 1
완성된 bit열을 외부로 inversion 하여 전송
내부에서 구성된 비트 조합은 0 1100 0010 1
실제로 전송되는 비트 조합은 1 0011 1101 0
아래는 케이블로 전송되는 신호를 오실로스코프로 캡처한 이미지이다.

 

ASCII "C"

 

 


 

실제 통신을 위한 예제

RS-232 Serial 통신-1

 

RS-232 Serial 통신-1

RS-232란? 위키백과의 RS-232 (Recommended Standard 232) https://ko.wikipedia.org/wiki/RS-232 RS-232 통신은 3 가닥의 선으로 데이터를 주고받을 수 있는 가장 간단한 하드웨어를 가진 통신 방식이다. 상대적..

hivac.tistory.com

RS-232 Serial 통신-2

 

RS-232 Serial 통신-2

이제는 실제 케이블을 연결해 통신 테스트를 해 볼것이다. 테스트 순서는 다음과 같다. 장치 전원 연결 통신 케이블 연결 통신 테스트 프로그램 설정 통신테스트 1. 장치 전원 연결 RS-232 Serial 통신-1에서 설명..

hivac.tistory.com

RS-232 Serial 통신-3

 

RS-232 Serial 통신-3

RS-232 Serial 통신1과 2에서 PC와 장치간의 RS-232통신에 필요한 것과 테스트 방법을 설명 하였다. 여기에는 실제 프로그래밍 툴과 장치와의 통신을 시도해 보겠다. 테스트 프로그램으로는 매뉴얼에 주어진 간단..

hivac.tistory.com


그리고 참고할 만한 사이트를 모아 두었으니 좀 더 확인하고 싶은 내용이 있으면 링크를 클릭.

시리얼 통신의 기초
http://www.hardcopyworld.com/ngine/aduino/index.php/archives/2080

반이중 통신 방식의 설명
https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%A4%91%ED%86%B5%EC%8B%A0

RS-232(RS232) 통신의 파형
https://m.blog.naver.com/specialist0/221024147144

D-SUB Connector 규격
https://www.sgconnector.com/d-sub-connector-layout-from-signalorigin.html


'진공 > 노하우' 카테고리의 다른 글

센서 그리고 자동제어  (0) 2020.04.06
모드버스  (3) 2020.04.01
PC에서 PLC ACCESS 하기 (2)  (16) 2019.12.02
PC에서 PLC ACCESS 하기 (1)  (13) 2019.09.19
RS-232 Serial 통신-3  (0) 2019.06.25
Comments