2011-12-16 4 views
0

하이퍼 터미널 또는 Docklight를 실행 한 후 내 프로그램이 작동하고 (쓰기 및 확인) 하지만 내가 그 중 하나도 실행하지 않으면 내 모든 읽기가 실패합니다.직렬 포트 쓰기 성공, 읽기 실패

그래서 제 시리얼 포트 초기화 코드에 뭔가 빠져 있어야합니다. 그러나 나는 무엇을 알아낼 수 없습니다. 여기있다 :

직렬 포트 초기화 :

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

당신이해야 처음 열린 포트, 구성보다. 그리고 코드는 반대 방향으로 수행합니다. 이것이 구성 코드가 작동하지 않고 포트가 기본 설정으로 열리는 이유입니다. 당신의 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

그걸 깨달았 어. 내 머리를 쳤어. 그걸 해결하고 나 자신에게 대답하려고 왔어. 그리고 너는 나를 때렸다! 명성! –