Visual studio 2012 Windows+;SetCommState如何设置RTS?
我有一个从VC++6移植过来的应用程序,在那里它工作得很好。该代码使用WinAPI作为串行设备驱动程序。当移植到VS2012时,同一代码的行为完全不同 创建一个DCB,设置SetCommState并启动。CTS设置为高,RTS设置为高,您正在路上 由于已移植到VS2012 Pro MFC,我发现它在设置SetCommState时无论是否使用硬件流控制都是一样的: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);
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();
}