2011-12-16 16 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()を使用して間違いをキャッチします。 –

+0

となる場合があります。これはレガシーコードで、今日初めて初めて見ました。 –

答えて

3

は、設定よりも第1の開いているポート、必要があります。そしてあなたのコードは反対方向にそれを行います。そのため、設定コードは機能せず、ポートはデフォルト設定で開きます。あなたのhyper terminalプログラムは、デフォルトの設定を調整思わ

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を使用した後に、それはで開いたときに理由です:

ちょうどあなたのコードを見て正しい設定。

+0

それを実現し、頭を叩き、それを解決してここに来て自分に答えた。名誉! –

関連する問題