|
^^;
우선 gethcomm() 이 888을 리턴하는것은 맞을수도 있고 틀릴수도 있습니다. ^^
핸들값은 32비트 정수값이며 이것은 운영체제(윈도우)가 부여해주는것이라서
무엇이 될지는 알 수 없습니다. 예를들어 다음에 실행할때는 그 값이 888이 아닐수도
있다는 것이지요.
그러므로 CreateFile로 포트를 열었을때 넘어오는 핸들값이
몇번 포트를 열었던 핸들 값이다. 라는것을 프로그래머는 저장해둬야 합니다.
포트1 -> 888
포트2 -> 999
포트3 -> 000
이런식으로 매핑을 시켜둬야하죠.
만약 윈도우가 항상 정해진 핸들을 부여해 준다면
예를 들어
COM1 -> 00001
COM2 -> 00002
이런식이라면 핸들의 값만 가지고 바로 포트를 유추할 수 있겠지만.
핸들은 랜덤하게 부여되기 때문에
핸들을 받을때는 항상
"몇번포트를 열었더니 어떤 핸들을 주는군" 라고 기억해놔야지
나중에 핸들값으로 포트를 역추적 할 수 있답니다 @_@;
그리고 제가 썻던 예는 보거스님의 소스에 접목시키기엔
무리가 있습니다. ^^; 실제 사용하기 위한 소스가 아니기에..
그리고 에러나는 문제는 아무래도 함수선언이 잘못되있지 않나 싶습니다.
-_-; gethcomm()이 void * 를 리턴한다는건 --;
저도 초보라 모르는것이 많은데요 읽어주셔서 감사하구요.
혹시 또 문제거리가 생겨서 같이 풀어가면
저또한 공부도 되고 참 좋을거 같네요 ^^;
msn : warship2000@hotmail.com
보거스 님이 쓰신 글 :
: 이렇게 여러번 답변 주셔서 너무 감사드립니다.
:
: BOOL ccomm32::opencomm(int nport, DWORD dwbrate)
: {
: char port[5];
: int n_Port[20];
: wsprintf(port, "COM%d", nport);
: n_Port[nport-1] = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL,
: OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
: 중략...
: }
:
: DWORD ccomm32::readcomm(BYTE *by, int nlen)
: {
: int h_Port = gethcomm();
: 중략...
: }
:
: 에러 해당 부분은
: (40): 은
: n_Port[nport-1] = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL,
: OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
:
: (142): 은
: int h_Port = gethcomm(); 부분이에요.
:
: 스레드는 사용하지 않구요.(사실 사용하기 좀 어렵던데요.)
: 타이머를 이용해서 1초 간격으로 readcomm() 호출해서 데이타가 들어왔을때만 처리하거든요.
:
: 처음에 프로그램 시작시 장비와 연결되어 있는 포트(멀티포트)를 순차적으로 OPEN하고 그 다음에는
: 어차피 멀티포트이기 때문에 각각 독립된 포트로서 데이타를 송,수신 하지 않습니까? 맞나요?
:
: 블럭킹 모드로 들어가지는 않는것 같구요.
: gethcomm() 함수는 맨 마지막에 ( sethcomm(X) ) 한것만을 리턴할거 같은데요? 라고 말씀하셨는데
: 생각해보니 그럴것 같네요.
:
: 그러면 핸들을 선언할때 배열로 선언해서 어떻게 처리하면 될것 같은데
: 그걸 int type으로 보면 888 과 같은 숫자가 나와서요.
: COM1을 Open 해서 그 포트로 데이타가 들어오면 1 이라는 숫자가 나와야 되는거 아닌가요?
:
: WARSHIP님 이렇게 도와주셔서 감사드리구요.
: 지금까지 말씀하신 방향으로 접근해보도록 하겠습니다.
:
:
:
:
:
: WARSHIP 님이 쓰신 글 :
: : 40/142 번 줄을 좀 보여주세요 ^^;
: : 핸들값은 32비트 정수형이기 때문에
: : 제가 말씀드린 그부분에서 에러나는거 같지는 않거든요 ^^;
: : (혹시 모르니 선언을 HANDLE X,Y; 이런식으로 해보시구용 @_@);
: : 그리고 전체 소스를 보지 않아서 모르겠지만
: : 아래의 것들로만 유추한다면
: : gethcomm() 함수는 맨 마지막에 ( sethcomm(X) ) 한것만을 리턴할거 같은데요?
: : 제말은 고로..
: : 동시에 여러 포트를 감시하려면 10개를 감시하려면
: : 10개의 쓰레드를 돌려야 하지 않는가 입니다.
: : timeout을 주지 않은 상태에서 ReadFile(~~)하게 되면
: : 컴퓨터는 그상태에서 블럭킹 모드로 돌입합니다(올때까지 기다리죠, 다른것을 할 수 없습니다.)
: : (timeout을 아주 짧게 잡고 루프로 돌린다는것도 좀 문제가 있죠)
: : 각각 포트에 대해 감시하는 쓰레드를 붙혀주고 만약 입력이 들어올 경우에는
: : 메인 쓰레드(메인 프로그램)에 통지를 해서 처리하는 방식이어야 하지 않나 생각됩니다.
: :
: : 사실 저도 말하면서도 이게 맞나 싶지만, 보거스님이 올려주신 소스만 가지고 판단할 때
: : 맨 마지막에 sethcomm() 했던 포트만 감시할 수 있을거 같습니다.
: : 저도 연구좀 해봐야겠네요 ^^;
: :
|