现在的位置: 首页 > 综合 > 正文

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

2014年09月05日 ⁄ 综合 ⁄ 共 1221字 ⁄ 字号 评论关闭

在工作中,需要不断的设置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串口有效,目前还没找到原因,而且步骤有点繁琐,不建议使用。
方法二目前测试来看,还没有找到无效的,基本都能设置,而且步骤简单,建议使用。

抱歉!评论已关闭.