2013-08-06 102 views
0

我有一個應用程序已經從VC++ 6移植到它工作正常。有問題的代碼使用WinAPI作爲串行設備驅動程序。當移植到VS2012時,相同的代碼行爲會有所不同。Windows + SetCommState如何設置RTS?

創建一個DCB,設置SetCommState並去。 CTS高,RTS高,你在路上。

由於移植達VS2012臨MFC中,我發現,它建立SetCommState帶或不帶硬件流控制是相同的:

memset(&dcb, 0x00, sizeof(dcb)); 
dcb.DCBlength = sizeof(DCB); 

// Must be TRUE, only binary mode in Windows 
dcb.fBinary = TRUE; 
dcb.fParity = FALSE; 

// XOn/XOff disabled 
dcb.fTXContinueOnXoff = TRUE; 
dcb.fOutX = FALSE; 
dcb.fInX = FALSE; 
dcb.XonLim = 0; 
dcb.XoffLim = 0; 
dcb.XonChar = 0; 
dcb.XoffChar = 0; 

// Misc Stuff 
dcb.EofChar = 0; 
dcb.EvtChar = 0; 
dcb.ErrorChar = 0; 
dcb.fErrorChar = FALSE; 
dcb.fNull = FALSE; 
dcb.fAbortOnError = FALSE; 

// 8N1 Setup 
dcb.ByteSize = 8; 
dcb.Parity = NOPARITY; 
dcb.StopBits = ONESTOPBIT; 

// Baud Rate 
if (dwBaudRate == BAUD_115200) 
{ 
    dcb.BaudRate = CBR_115200; 
} 
else 
{ 
    dcb.BaudRate = CBR_38400; 
} 

// setup hardware flow control 
if (bHardware == eYesHardwareFlowControl) 
{ 
    // ================ FLOW CONTROL ON ================ 
    switch (bIgnoreCTS) 
    { 
     case eIgnoreCTS: 
      dcb.fOutxCtsFlow = FALSE; 
      break; 

     case eEnableCTS: 
      dcb.fOutxCtsFlow = TRUE; 
      break; 

     default: 
     case eCTSDecideLater: 
      dcb.fOutxCtsFlow = TRUE; 
      break; 
    } 

    // DSR Flow Control 
    dcb.fDsrSensitivity = FALSE; 
    dcb.fOutxDsrFlow = FALSE; 

    // <<Hardware flow control On(TRUE) Off(FALSE)>> 
    dcb.fDtrControl = DTR_CONTROL_ENABLE; 

    // <<Hardware flow control On(_HANDSHAKE) Off(_ENBLE)>> 
    dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; 
} 
else 
{ 
    // ================ FLOW CONTROL OFF ================ 
    switch (bIgnoreCTS) 
    { 
     case eIgnoreCTS: 
      dcb.fOutxCtsFlow = FALSE; 
      break; 

     case eEnableCTS: 
      dcb.fOutxCtsFlow = TRUE; 
      break; 

     default: 
     case eCTSDecideLater: 
      dcb.fOutxCtsFlow = FALSE; 
      break; 
    } 

    // DSR Flow Control 
    dcb.fDsrSensitivity = FALSE; 
    dcb.fOutxDsrFlow = FALSE; 

    dcb.fDtrControl = DTR_CONTROL_ENABLE; 
    dcb.fRtsControl = RTS_CONTROL_ENABLE; 
} 

if (SetCommState(m_hIdComDev, &dcb) == WINDOWS_API_ZERO_IS_BAD) 
{ 
    dwLastError = GetLastError(); 
} 

在這一點上,我已經設置了DCB,清除它。我不讀以前的狀態是我不想相信以前使用過這個端口的任何人的垃圾。然後我設置波特,流量控制和CTS忽略是唯一可選項目的每個字段。

所以,我注意到,我可以創建設備和PC不通信的情況。現在,請注意,他們以前總是這樣做,他們一直與超級終端,ProComm,TeraTerm等合作。我能看到的是,當這些通訊程序啓動時(以及舊的VC++ 6應用程序),當設備創建並設置時,RTS立即設置爲高。

現在,我的應用程序,一旦DCB被設置,SetCommState被調用; RTS始終爲低。當這種情況發生時,通信就是敬酒。

我想迫使RTS要高,我想我能做到這一點是這樣的:

if (EscapeCommFunction(m_hIdComDev, CLRRTS) == WINDOWS_API_ZERO_IS_BAD) 
{ 
    dwLastError = GetLastError(); 
} 

if (EscapeCommFunction(m_hIdComDev, SETRTS) == WINDOWS_API_ZERO_IS_BAD) 
{ 
    dwLastError = GetLastError(); 
} 

但這種失敗,它給出了一個錯誤87(參數錯誤)。我無法弄清楚。即使我只是SETRTS高,它失敗了。

在我設置DCB中的comm參數後,如何強制Windows將RTS設置爲高電平有任何想法?

+0

當嘗試手動設置RTS時握手或切換設置爲DCB中的RTS時發生錯誤87。我愚蠢的錯誤。漢斯的其他物品都照顧好了。所以這就留下了...爲什麼WinAPI無論如何駕駛RTS都很低? – RallyRabbit

回答

0

那麼它竟然是一個設備問題,而不是Windows的問題。