使用API函数打开串口,关闭后再打开即出错!

wudicainiao2 2018-06-22 04:13:12
最近使用CreateFile进行串口操作,环境为vc2013 unicode 下,使用句柄函数打开

if (!m_Com.NewConnection(DATA_BY_CALLBACK, 0, nPort, this, OnCallbackComMsg))
{
MessageBox(_T("串口打开错误!"), _T("错误"), MB_ICONINFORMATION);
return;
}

HANDLE CComLink::OpenConnection(AFX_THREADPROC pfnThreadProc, BYTE nPort)
{
HANDLE h_Com;
wchar_t szPort[15];
COMMTIMEOUTS CommTimeOuts;

wsprintf(szPort,_T("\\\\.\\COM%d"),nPort);

h_Com = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(h_Com == INVALID_HANDLE_VALUE)
return NULL;
……
}

打开后关闭
m_Com.CloseCom();

BOOL CComLink::CloseCom(/*HANDLE h_Com*/)
{
m_bConnected = false;
return FindClose(m_hCom);
}

发现运行后,第一次打开串口(笔记本插入usb转rs232线,串口号5),正常,也能发送数据
然后点关闭后再次打开,即出错,显示打开错误!跟踪显示句柄为0fxxxxxxxx。
不知何原因?如何解决?
...全文
1832 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
求救:为什么程序运行后打开一次再关闭后就不能打开了?
yiyefangzhou24 2018-06-25
  • 打赏
  • 举报
回复
m_Com.CloseCom();->CloseHandle()
笨狗先飞 2018-06-24
  • 打赏
  • 举报
回复
你的 h_Com 是函数内的局部变量
这关串口的时候需要传这个句柄来关的。
wudicainiao2 2018-06-24
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
试试在关闭后,用WinExec("cmd /c devcon.exe ...",SW_HIDE);调用命令行设备管理器devcon将对应串口禁用再启用试试。

能否详细点呢?WinExec没有用过
另外发现FindClose无法关闭串口,用CloseHindle又会出错
笨狗先飞 2018-06-24
  • 打赏
  • 举报
回复
CreateFile 打开串口
CloseHandle 关闭串口
然后 FILE_FLAG_OVERLAPPED 参数用0代替一下试试?
wudicainiao2 2018-06-24
  • 打赏
  • 举报
回复
引用 3 楼 bakw 的回复:
你的 h_Com 是函数内的局部变量
这关串口的时候需要传这个句柄来关的。

我单独关了h_Com,发现也没有用!
赵4老师 2018-06-23
  • 打赏
  • 举报
回复
试试在关闭后,用WinExec("cmd /c devcon.exe ...",SW_HIDE);调用命令行设备管理器devcon将对应串口禁用再启用试试。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧