하이퍼 터미널 또는 Docklight를 실행 한 후 내 프로그램이 작동하고 (쓰기 및 확인) 하지만 내가 그 중 하나도 실행하지 않으면 내 모든 읽기가 실패합니다.직렬 포트 쓰기 성공, 읽기 실패
그래서 제 시리얼 포트 초기화 코드에 뭔가 빠져 있어야합니다. 그러나 나는 무엇을 알아낼 수 없습니다. 여기있다 :
직렬 포트 초기화 :
bool CSerialPortDrivenHardware::InitSerialPort(){
m_SerialPort.Config(m_SerialPortConfig);
bool success = (m_SerialPort.Open(m_SerialPortName) == TRUE);
if(!success)
Log(LOG_TYPE_ERROR, "CSerialPortDrivenHardware", "InitSerialPort", "Could not establish serial port connection");
else{
m_SerialPort.SetControlBit(DTR_CONTROL_BIT);
m_SerialPort.SetControlBit(RTS_CONTROL_BIT);
}
return success;
}
직렬 포트 클래스 (관련 코드) :
BOOL CSerialPort::Config(SConfig sConfig) {
if(!m_hFile) return FALSE;
DCB dcb;
if (!::GetCommState(m_hFile, &dcb)) {
m_dwLastError = ::GetLastError();
return FALSE;
}
dcb.BaudRate = sConfig.dwBaudRate;
dcb.Parity = sConfig.bParity;
dcb.StopBits = sConfig.bStopBits;
dcb.ByteSize = sConfig.bDataBits;
if (!::SetCommState(m_hFile, &dcb)) {
m_dwLastError = ::GetLastError();
return FALSE;
}
::Sleep(200);
return TRUE;
}
BOOL CSerialPort::Open(LPCSTR cszCOM) {
CHAR sPortName[256] = "\\\\.\\";
strcat_s(sPortName, cszCOM);
m_strPortName = sPortName;
if(m_hFile)
return FALSE;
m_hFile = ::CreateFile(m_strPortName.c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(m_hFile == INVALID_HANDLE_VALUE)
m_hFile = NULL;
if(!m_hFile)
return FALSE;
SetFlags(0);
return TRUE;
}
void CSerialPort::SetFlags(DWORD dwFlags) {
if(dwFlags & READMODE_BLOCKING)
SetTimeout(INFINITE);
else
SetTimeout(0);
}
void CSerialPort::SetTimeout(DWORD dwTimeout) {
COMMTIMEOUTS sCommTimeouts;
if(!::GetCommTimeouts(m_hFile, &sCommTimeouts)) {
m_dwLastError = ::GetLastError();
return;
}
sCommTimeouts.ReadIntervalTimeout = 0;
sCommTimeouts.ReadTotalTimeoutMultiplier = 0;
sCommTimeouts.ReadTotalTimeoutConstant = dwTimeout;
if (!::SetCommTimeouts(m_hFile, &sCommTimeouts))
m_dwLastError = ::GetLastError();
}
BOOL CSerialPort::SetControlBit(ESerialPortControlBit eControlBit) {
if(!m_hFile)
return FALSE;
BOOL bResult = FALSE;
switch(eControlBit) {
case DTR_CONTROL_BIT:
bResult = ::EscapeCommFunction(m_hFile, SETDTR);
break;
case RTS_CONTROL_BIT:
bResult = ::EscapeCommFunction(m_hFile, SETRTS);
break;
}
return bResult;
}
assert()를 사용하여 실수를 포착하십시오. –
알 수 있습니다. 이것은 레거시 코드이며, 오늘 처음으로 살펴 보았습니다. –