本文介绍了串口写操作成功,读操作失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我运行超级终端或Docklight后,我的程序工作(写入和读取确定)。但是如果我从来没有运行任何这些,所有我的读取失败。

After I run Hyper Terminal or Docklight, my program works (writes and reads OK). But if I never run any of those, all my reads fail.

所以我想我必须缺少的东西在我的串口初始化代码,但我不能出什么。这是:

So I guess I must be missing something in my serial port initialization code, but I can't figure out what. Here it is:

串行端口初始化:

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;
}


推荐答案

比配置。和你的代码在相反的方向。这就是为什么您的配置代码不工作,端口只打开默认设置。

You should first open port, than configure. And your code does it in opposite direction. That's why your configure code does not work and port just opens with default settings.

只需查看您的代码:

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

并且 m_hFile 设置在 CSerialPort :: 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);
 .....

看起来你的 / code>程序调整默认设置,这就是为什么当您使用`超级终端后打开端口时,它会打开正确的设置。

It seems your hyper terminal program adjust default settings and that's why when you open port after using `hyper terminal it opens with correct settings.

这篇关于串口写操作成功,读操作失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 17:56