C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[38767] Re:Re:Re:Re:Re:Re:Re:[질문]죄송합니다. 한번만 더 봐주실래요.
WARSHIP [warship] 980 읽음    2005-01-14 16:25
^^;

우선 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() 했던 포트만 감시할 수 있을거 같습니다.
: : 저도 연구좀 해봐야겠네요 ^^;
: :

+ -

관련 글 리스트
38744 [질문]포트확인? 보거스 1516 2005/01/13
38746     Re:[질문]포트확인? WARSHIP 1152 2005/01/13
38748         Re:Re:[질문]소스 한번 봐 주실래요. (포트번호는 안오는것 같거든요) 보거스 1452 2005/01/13
38757             Re:Re:Re:[질문]소스 한번 봐 주실래요. (포트번호는 안오는것 같거든요) WARSHIP 1025 2005/01/14
38760                 Re:Re:Re:Re:[질문]죄송합니다. 한번만 더 봐주실래요. 보거스 1014 2005/01/14
38762                     Re:Re:Re:Re:Re:[질문]죄송합니다. 한번만 더 봐주실래요. WARSHIP 973 2005/01/14
38764                         Re:Re:Re:Re:Re:Re:[질문]죄송합니다. 한번만 더 봐주실래요. 보거스 1037 2005/01/14
38767                             Re:Re:Re:Re:Re:Re:Re:[질문]죄송합니다. 한번만 더 봐주실래요. WARSHIP 980 2005/01/14
38768                                 Re:Re:Re:Re:Re:Re:Re:Re:[감사]정말 많이 도움되었습니다. 보거스 1052 2005/01/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.