Visual studio 2012 Windows+;SetCommState如何设置RTS?

Visual studio 2012 Windows+;SetCommState如何设置RTS?,visual-studio-2012,windows-7,mfc,serial-port,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);

我有一个从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();
}
但这失败了,它给出了一个错误87(参数错误)。我也不太明白。即使我只是将RTS设置为高,它也会失败


在DCB中设置通信参数后,如何强制Windows将RTS设置为高?

这是一个设备问题,根本不是Windows问题。

在DCB中为RTS设置握手或切换时,尝试手动设置RTS时出现错误87。我犯了一个愚蠢的错误。汉斯的其他物品也由他保管。这样就剩下了。。。为什么WinAPI驱动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();
}