ハイパーターミナルまたは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()を使用して間違いをキャッチします。 –
となる場合があります。これはレガシーコードで、今日初めて初めて見ました。 –