0
運行超級終端或Docklight後,我的程序工作(寫入和讀取OK)。但是如果我從來沒有運行過任何一個,我的所有讀取都會失敗。串口寫入成功,讀取失敗
所以我想我必須在我的串口初始化代碼中丟失一些東西,但我無法弄清楚什麼。那就是:
串口初始化:
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()來捕捉錯誤。 – 2011-12-16 18:35:22
可能。這是傳統代碼,今天第一次查看它。 – 2011-12-16 19:54:15