|
// .cpp file
// port open
BOOL ccomm32::opencomm(int nport, DWORD dwbrate)
{
COMMTIMEOUTS commtimeouts;
DCB dcb;
char port[5];
if(getconnected())
closecomm();
wsprintf(port, "COM%d", nport);
sethcomm(CreateFile(port, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));
if(gethcomm() != INVALID_HANDLE_VALUE)
{
SetCommMask(gethcomm(), EV_RXCHAR);
SetupComm(gethcomm(), RXQUEUE, TXQUEUE);
PurgeComm(gethcomm(), PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR);
dcb.DCBlength = sizeof( DCB );
GetCommState(gethcomm(), &dcb);
dcb.BaudRate = dwbrate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if(!SetCommState(gethcomm(), &dcb))
{
closecomm();
return false;
}
commtimeouts.ReadIntervalTimeout = MAXDWORD;
commtimeouts.ReadTotalTimeoutMultiplier = 0;
commtimeouts.ReadTotalTimeoutConstant = 0;
commtimeouts.WriteTotalTimeoutMultiplier= 0;
commtimeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(gethcomm(), &commtimeouts);
setconnected(true);
}
else
{
ShowMessage((AnsiString)port + " 통신포트 오류");
return false;
}
return true;
}
//---------------------------------------------------------------------------
// data 수신부
DWORD ccomm32::readcomm(BYTE *by, int nlen)
{
if(getconnected())
{
COMSTAT comstat;
DWORD dwerrflgs, dwbytesread;
ClearCommError(gethcomm(), &dwerrflgs, &comstat);
dwbytesread = min(nlen, RXQUEUE);
if(dwbytesread > 0)
{
// Debug로 따라가 보니까 gethcomm()은 값이 00000378 로 오는데요.
ReadFile(gethcomm(), by, dwbytesread, &dwbytesread, NULL);
return dwbytesread;
}
}
return DISCONNECTED;
}
//---------------------------------------------------------------------------
// 헤더 file 부분
class ccomm32: public ccrc16
{
private :
BOOL m_bconnected;
HANDLE m_hcomm;
BYTE m_str[4096];
String m_tmpc;
public :
ccomm32();
~ccomm32();
void sethcomm(HANDLE hcomm)
{ m_hcomm = hcomm; }
HANDLE gethcomm()
{ return m_hcomm; }
void setconnected(BOOL hconnected)
{ m_bconnected = hconnected; }
BOOL getconnected()
{ return m_bconnected; }
B OOL opencomm(int nport, DWORD dwbrate);
BOOL closecomm();
DWORD readcomm(BYTE *by, int nlen);
DWORD readcommch(BYTE &by);
DWORD writecomm(const BYTE *by, int nlen);
void clearcomm(BYTE bystat);
void asctohex(const BYTE *by, const WORD wlen, BYTE *byrtn);
void hextoasc(const BYTE *by, const WORD wlen, BYTE *byrtn);
};
//---------------------------------------------------------------------------
답변 감사드리구요. 죄송하지만 복잡하더라도 봐주십시요.
말씀하신 ReadFile의 첫번째 인자 (제 소스에서는 gethcomm()) Debug로 따라가 보면 00000378 로
값이 오거든요.
제소스에 문제가 있는건지요?
정상적으로 포트는 open되고 데이타도 잘 들어와요.
(pc의 포트 2개 (com1, com2)를 rs -232로 test 했거든요.)
근데 멀티포트로 통신했을때 어느 포트에서 데이타가 들어왔는지가 그게 문제거든요.
다시 한번 부탁드립니다.
WARSHIP 님이 쓰신 글 :
: 윈도우환경이시라면.
:
: 포트를 여실때
: CreateFile 을 사용하시면 그때 핸들을 가지고 있지 않나요?
: 그리고 ReadFile로 데이타를 받는다면 그 인수로 포트의 핸들을 넣어주어야 할텐데요?
:
: 200개를 연다고 해서 하나의 핸들로 컨트롤하는것이 아니기때문에
: ReadFile(hPort,~~) 했다는 것은 hPort로 들어왔다는걸 아는거 아닌가요? ^^;
:
: 제가 질문의 요지를 잘 이해하지 못한거 같기도 하구요. ^^;
|