编程实现单独设置COM串口DTR线(pin4)高低电平

时间:2021-11-04 12:27:26

在工作中,需要不断的设置COM串口DTR线(pin4)高低电平来达到自动控制的目的。

 

Google了一下,发现设置COM串口DTR线高电平API提供了一个函数

BOOL WINAPI SetCommConfig( __in HANDLE hCommDev, __in LPCOMMCONFIG lpCC, __in DWORD dwSize );

通过调用该函数,可以设置COM串口DTR线为高电平。设置隐藏在COMMCONFIG结构体中,首先先得到默认的COMMCONFIG结构体,再设定COMMCONFIG的DCB结构体中的fDtrControl = DTR_CONTROL_ENABLE,代码如下:

 

COMMCONFIG commConfig = {0};
DWORD dwSize = sizeof(commConfig);
commConfig.dwSize = dwSize;

 

if (::GetDefaultCommConfig(m_comGoldenTX.GetDevicePathName(), &commConfig, &dwSize))

{

commConfig.dcb.fDtrControl = DTR_CONTROL_ENABLE;
if (!::SetCommConfig(m_comGoldenTX.GetCommHandle(), &commConfig, dwSize))
{
// Display a warning
PrintDebug(_T("Unable to set enable the DTR line./n"));
}
}
else
{
// Display a warning
PrintDebug(_T(" Unable to obtain default communication configuration./n"));
}

 

 

本来可以依葫芦画瓢,使commConfig.dcb.fDtrControl = DTR_CONTROL_DISABLE,然后再SetCommConfig一下,发现这招对某些串口有用,但对某些串口却没有作用,很是奇怪。
google了很久,终于找到另一个API可以也能实现这个功能
BOOL WINAPI EscapeCommFunction( __in HANDLE hFile, __in DWORD dwFunc );
// Disables the DTR line.  
::EscapeCommFunction(m_comGoldenTX.GetCommHandle(), CLRDTR);
SleepEx(100, FALSE);
// Enable the DTR line.
::EscapeCommFunction(m_comGoldenTX.GetCommHandle(), SETDTR);
需要注意的是,在高低电平切换之间需要间隔一定的时间,否则基本是没有效果的
方法一只是对部分COM串口有效,目前还没找到原因,而且步骤有点繁琐,不建议使用。
方法二目前测试来看,还没有找到无效的,基本都能设置,而且步骤简单,建议使用。