2012년 12월 5일 수요일

Serial Port 를 열때의 주의점 (COM10 이상의 경우)

소스파일은 내가 만든 것이 아닌데, 그 소스를 내가 물려받아 modify한 적이 있다. 이 프로그램은 시리얼 포트를 열어서, 거기에 연결된 디바이스의 데이터를 다운로드하는 조금은 간단한 프로그램인데, 올초에 내가 수정을 가했기 때문에 내가 유지를 하고 있다.

그런데, 한달도 전에, 미국 사무실의 Alex라는 사람이, 이걸 쓰는데 안된다는 것.
문제를 살펴보니, 이 프로그램은 첨부터 너무 단순하게 만들어져 있어서, 오직 COM1 포트만을 들여다보고, 열리지 않으면 그냥 에러처리하고 튀어 나가게 되어 있었다. alex는 그런데, 노트북(랩탑)을 쓰고 있었고, 거기에는 시리얼 포트가 없으니, USB 포트를 시리얼로 바꾸는 드라이브를 깔아서 시리얼 포트를 잡아 쓰고 있었다.

Device Manager로 확인을 부탁한 결과 COM1이 아닌, COM16을 붙잡고 있었다.  이럴경우, 프로그램을 고치기 귀찮은 나머지, 그냥 COM16을 COM1으로 변경해주고, 프로그램을 돌리면 아무 문제가 없을듯... (이거 변경은, My Computer->Property->Device Manager로 들어가서 하면 됩니다)

하지만, 그래도 그런거 뭐 간단히 고쳐서 보내자 해서, COM16을 읽도록 함 바꿔보았다.
이거 하고나서, 포트 넘버를 받아들이는 간단한 인풋을 만들어 넣어야지.. 하고 생각했는데..
고쳐서 던져줬더니, 그래도 계속 에러가 나는 상황...

그게 왜그런가.. 계속 뒤져보니,,, 이런 이런.
msdn 사이트에 답이 있었다..

http://msdn.microsoft.com/en-us/library/aa363858%28v=VS.85%29.aspx


HANDLE WINAPI CreateFile(
  _In_      LPCTSTR lpFileName,
  _In_      DWORD dwDesiredAccess,
  _In_      DWORD dwShareMode,
  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_      DWORD dwCreationDisposition,
  _In_      DWORD dwFlagsAndAttributes,
  _In_opt_  HANDLE hTemplateFile
);

주욱 내려가서, Communication resource 쪽에 이런 문구가.. 흑.

To specify a COM port number greater than 9, use the following syntax: "\\.\COM10". This syntax works for all port numbers and hardware that allows COM port numbers to be specified.


음.. 9를 넘어가는, 그러니까 10부터는, 앞에다가 \\.\ 를 append해줘야 한단다.
실제로, 이건 C나 C++ 코드상에서 이렇게 붙여야 함. \\\\.\\COM16

그래서, 첨에 고쳤을떄, 단순히,
CreateFile(TEXT("COM1")....)
==> CreateFile(TEXT("COM16").... ) 했더니 COM16을 열지 못했던것.

이건 이렇게 고쳐야 함.
==> CreateFile(TEXT("\\\\.\\COM16"),.....)

아이고,,, 이것도 모르고,...  머리만 쥐어뜯었네.

잔디 3주차

 잔디 심기. 3주차에 접어들었음. 사진. 아래가 1일차 사진. 다음이 3주차.