Windows + SetCommState如何设置RTS?

时间:2013-08-06 21:17:45

标签: visual-studio-2012 windows-7 mfc serial-port

我有一个从VC ++ 6移植过的应用程序,它运行正常。有问题的代码使用WinAPI作为串行设备驱动程序。当移植到VS2012时,相同的代码表现得相当不同。

创建一个DCB,设置SetCommState然后去。 CTS设置得很高,RTS设置得很高,你就在路上。

由于移植到VS2012 Pro 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不通信的情况。现在,请注意,他们以前总是这样做,他们总是与Hyperterminal,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设置为高的任何想法?

1 个答案:

答案 0 :(得分:0)

原来它是一个设备问题,而不是一个Windows问题。