2011-12-16 77 views
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; 
} 
+1

使用assert()來捕捉錯誤。 – 2011-12-16 18:35:22

+0

可能。這是傳統代碼,今天第一次查看它。 – 2011-12-16 19:54:15

回答

3

你首先應該打開的端口,比配置。而你的代碼在相反的方向做它。這就是爲什麼你的配置代碼不起作用,端口只是打開默認設置。

看看你的代碼:

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後打開的端口它打開正確的設置。