|
감사합니다.
말씀하신데로 한번 해보겠습니다.
현재는 멀티포트를 아직 구매하지 않았구요.
들어오면 Open해서 각각 핸들값이 포트마다 다르고 일정한지 해보겠습니다.
그동안 올려주셨던 글을 보다보니까 포트 OPEN 할때 데이타 읽어들일때 handle을 배열로 선언해서
하다보면 될것도 같은데 머리속에서만 맴도네요.
한번 멀티포트 들어오기 전에 구현해서 잘되면 결과 알려드리겠습니다.
그리고 저는 msn을 사용한지 오래되서 주소가 기억이 안나네요. (암호도 잊어먹었어요.)
주로 이메일을 kjlee@koinel.com 을 많이 이용해요.
WARSHIP 님이 쓰신 글 :
: ^^;
:
: 우선 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() 했던 포트만 감시할 수 있을거 같습니다.
: : : 저도 연구좀 해봐야겠네요 ^^;
: : :
|