串口写入成功,读取失败

运行超级terminal或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; } 

你应该首先打开端口,而不是配置。 而你的代码是在相反的方向。 这就是为什么你的配置代码不工作,端口只是打开默认设置。

只要看看你的代码:

 BOOL CSerialPort::Config( SConfig sConfig ) { if( !m_hFile ) return FALSE; .... 

m_hFileCSerialPort::Open设置

 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); ..... 

看来你的hyper terminal程序调整了默认设置,这就是为什么当你使用`hyper terminal打开端口后,打开正确的设置。