모뎀과 시리얼 케이블

시리얼 포트, 패러랠 포트 등이 레거시 포트로 불리면서

PC나 노트북에서 사라져 가기 시작한지 꽤 오래됐다.

물론 일반 사용자야 별 필요없는 포트들이지만

개발자 입자에서는 (특히 임베디드 개발자) 아직 여러모로 쓸모 있는 포트다.

(얼마전 새로 지급 받은 노트북에도 시리얼 포트랑 패러랠 포트가 없더라.

지난 번에 쓰던 노트북이 좀 무깍기해도 시리얼 이랑 패러랠이 1개씩

달려 있어서 좋았는데.. 그래도 USB-to-Serial 장치가 있으니 상관없나)

모뎀의 경우에도 시리얼 통신을 통해 제어를 하기 때문에 모뎀 관련

어플리케이션을 개발 할때 시리얼 포트는 필수다.

(모뎀도 요새는 일반 전화선 모뎀 보다는 CDMA 모뎀을 많이 쓰는 거 같지만)

머.. 암튼 각설하고;;;;

요번에 장비에 CDMA 모뎀을 연결해서 개발 중인 프로젝트가 있다.

직접 개발 하는 건 아니고, 다른 사람을 시켜서…

일단 간단하게 시리얼 통신 하는 거 부터 시작해서 모뎀 제어 까지

하도록 하고 있다. 그런데, 시리얼 통신 까지는 문제가 없는데

모뎀을 연결해서 하면 제대로 되지를 않는다는 거다.

확인해 보니 진짜 시리얼 통신하는 루틴에는 문제가 없고,

모뎀도 PC에 연결해서 확인해 보면 정상적으로 작동하고,

도저히 의심할 구석이 없는 거다.

모뎀은 기본적으로 입력을 echo 시켜서 출력으로 다시 주게

되어 있으므로(아닌 경우도 있고, 끌수도 있지만)

모뎀으로 먼가를 보내면 출력으로 나오게 되어 있고,

AT 커맨드가 입력됐을 경우에는 응답코드가 출력되게 되어있다.

근데, 입력을 받고도, 당최 출력을 주지 않는 거다-_-

마지막으로 의심할 만한 부분은 모뎀과 장비 사이를 연결하는

시리얼 케이블. 그런데 테스트 해보니 케이블도 문제가 없었다.

다시 원인은 오리무중. 미칠지경이다-_-

그 후, 다시 테스트 해 본 바로는 분명 모뎀으로 보낸 AT 커맨드는

모뎀으로 전달이 됐고, 모뎀도 그에 상응 하는 동작을 한다는것이 확인됐다.

그럼, 입력은 받는데… 출력을 안준다는 건데…

점점 더 사건은 미궁속이다-_-;;;

시리얼 케이블 결선도도 뚫어져라 보고, 시리얼 케이블들도

뜯어보고… 다각도로 고민하던 중, 문득, 머리를 스치는 생각.

역시 결론은 시리얼 케이블!

문제의 케이블이 PC와 장비를 연결했을 때는 아무런 문제가 없다.

그런데 모뎀이랑 연결하면 작동을 하지 않는다.

그렇다면… PC와 통신할때는 쓰지 않는 다른 라인이 문제라는 것이 결론이다.

요즘의 시리얼 포트는 9핀 짜리 이긴 하지만, 실제로는 3개만 있으면

통신이 가능하다.  2번 RXD, 3번 TXD, 5번 그라운드.

보통은 이 3개의 핀만을 연결하고, 통신 하는 상호간에 [흐름제어 없음]으로 설정하여

시리얼 통신을 한다.

(음, 흐름제어를 따로 안 쓰는건 그만큼 시리얼 통신의 신뢰성이 높아져서 일까?)

그래서 케이블을 만들때도 3개만 연결하곤 하는데…

나머지 6개의 핀중 2개는 잘 모르겠고, 4개는 하드웨어 흐름제어를 하기 위해 필요한

핀인데… 이것이 문제란 말인가…

문득 뜯어본 다른 케이블에서 흐름제어에 사용되는 핀이 반대쪽 라인과 연결되지 않고,

같은 포트 쪽에 핀끼리 서로 물려 있었던 것이 생각 났다.

그리고, 다른 곳에서 찾은 결선도에서 그와 같은 형태로 나와 있었다.

하드웨어 흐름제어를 사용하는 장비를 속이는 일종의 트릭으로 생각 되는데…

7번 CTS와 8번 RTS를 서로 연결하고, 4번 DTR과 6번 DSR을 서로 연결하여,

자기가 보낸 신호를 상대방이 그에 대한 응답으로 보낸 신호로 착각하게 만드는 것이다.

[모뎀]                                                  [장비]
2(RXD) ——————————- 3(TXD)

3(TXD) ——————————- 2(RXD)

4(DTR) —+
                |
6(DSR) —+

5(GND) ——————————- 5(GND)

7(CTS) —+
                |
8(RTS) —+

(대충 이렇게…)

모뎀이 항상 하드웨어 흐름제어를 사용해야만 하도록 되어 있고, 문제의 케이블은

그런 트릭이 사용되지 않았다고 가정한다면, 하드웨어 흐름제어가 먹히지 않아서

모뎀이 전송을 했으나 장비쪽에 수신이 되지 않았을꺼라는 것은 가능성이 있는 얘기였다.

(문제의 케이블은 포트 쪽을 뜯어 볼수가 없어서 정확히 확인이 어려웠다.)

그래서, 즉각 작업에 착수했다. 사실 서로 하드웨어 흐름제어를 쓰는게 맞긴 하겠지만…

일단은 위의 트릭을 써서 케이블을 새로 만들고, 모뎀과 장비를 연결.

그리고, 전원 on!

짜잔~ 드디어 모뎀 쪽에서 데이터가 전송되어 오는 것을 확인 할수 있었다 🙂

오늘의 교훈. 시리얼 케이블은 제대로 만들자-_-

모뎀의 작동 방식(?)

회사 일 때문에 이런 저런 생각하다가…

문득 궁금해진 모뎀의 작동 방식(?)

일반 전화 모뎀 말고….

ADSL이나 케이블 모뎀 같은거 말이다…

분명히 실제 네트웍에 연결되는 건 이들 모뎀인데…

아이피 라든가.. 통신 하는 것 등이 마치 모뎀에 물린

PC가 직접 네트웍에 연결 된 듯 작동한다.

구글 신께 물어서 여기 저기 보다가 도착한 곳은

결국 위키피디아.

 – PPPoE
 – 케이블 모뎀

나의 궁금증을 해소해 준 두 개의 글이다.

ADSL은 요즘은 케이블 처럼 꼽으면 바로 쓸수 있나 본데…

(난 xDSL 시리즈를 한번도 써본적이 없어서 잘 모르지만…)

예전에는 PC에서 프로그램을 실행해야 했었다

이 당시 사용된 것이 PPPoE(Point-to-Point Protocol over Eternet)라는 것.

보통 전화 모뎀으로 통신을 할때 사용되는 PPP를 이더넷을 이용해서 전송하는

기술 이라나.. 그래서 ADSL 모뎀과 PC는 이더넷 인터페이스로 연결 되면서도

모종의 프로그램에 의한 절차(가상으로 전화연결)가 필요했던 것이다.

그리고, 아마 PC에서 생성된 TCP/IP 패킷은 바로 이더넷 카드로 전달 되는게

아니고, PPPoE 쪽 드라이버를 거친 다음 이더넷으로 전달되는거 같다.

(자세한건 아직 잘 모르겠지만 대충 그렇단 얘기다;;)

그리고 요즘의 xDSL이나 케이블 모뎀에서 사용되는 방식은 포워딩!

케이블 모뎀은 PC로 부터 전송되는 패킷을 케이블 망을 통해서

케이블 망 반대편의 네트웍 상으로 그대로 전송해 주는 것이다.

단, 어플리케이션 레벨에서 케이블 망으로 나가서는 안될 패킷들

(윈도우 NetBIOS 라든가 로컬 네트웍상에서 유효한 패킷 같은거)을

걸러 주는 역할도 하고, 자체적으로 IP주소를 할당받아서

관리용도로도 쓰는 등등 네트웍 레이어 전반에 걸쳐서 뭔가를 하고 있단다.

아무튼 내가 알고 싶던 얘기에 관련된 핵심은 모뎀에 연결된 PC와 케이블망

저쪽 사이에서 거를꺼 거르면 그대로 포워딩을 해준다는것.

(아마 서비스 업체의 서버에서 모종의 역할을 해주기에 가능하겠지..

모뎀과 PC에 모두 IP가 할당되기도 해야 하고…)

==

아직은 모르는게 너무 많아 =_=

그나저나… 저런것들에 대해 알고 나니…

내 생각이 더 맞는거 같은데, 왜 다들 아니라고 하는 건지;;;

아웅~ 진짜 내가 잘못 생각하고 있는 거냔 말야~