MFC使用MSComm控件,关闭串口以后再次打开的时候提示“The device is not open”

liudonghai11 2017-07-04 03:00:38
如题,我在一个UI线程中添加了一个MSComm控件,然后设置参数,打开串口,设置好相应的响应函数,可以正常的读取数据,然后我在界面上有两个控件,一个新建串口连接,一个断开串口连接,新建串口的操作中会设置相应的串口参数,此时两个控件是可以正常使用的,也就是可以多次断开然后连接,都是可以正常读到数据。但是如果我将整个UI线程关闭,然后再次打开UI线程,此时无法再次打开串口。
我在每次关闭UI线程的时候有检测串口的状态,如果是打开的会用put_PortOpen(false)函数将其关闭,并且及时我首先手动点击之前可以使用的控件将串口关闭,然后在关闭UI线程,再次打开的是时候都无法打开串口,显示“Tne device is not open”.并且我在打开的串口之前有检测串口的合法性,没有报错,就是无法打开。
并且如果我打开UI线程后不去连接串口,关闭后再次打开线程,然后串口是可以使用的,所以初步判断是没有成功关闭串口,请问我put_PortOpen(false)这样关闭不了串口吗,并且在调用该函数后,我也检查过串口get_PortOpen()是关闭的,如果是关闭串口的问题,请问我该如何关闭串口?请高人解答,谢谢。。。
这是关闭串口代码:
while(m_ConnectMSCom->get_PortOpen())
{
AfxMessageBox(L"关闭串口");
m_ConnectMSCom->put_PortOpen(false);
//Sleep(10);
}

这是打开串口的代码:
this->m_MSCom->put_CommPort(iComNumber);
//this->m_MSCom->put_CommPort(iComNumber);
this->m_MSCom->put_InBufferSize(1024 * 1024*10);
this->m_MSCom->put_OutBufferSize(1024);
if (!this->m_MSCom->get_PortOpen())
{
this->m_MSCom->put_PortOpen(true);
}

//this->m_MSCom->put_PortOpen(true);
//如何打开串口:
//put__CommPort(3);
//put_PortOpen(true);
//现在串口三就是打开的了
//get_PortOpen检查串口的打开状态
this->m_MSCom->put_InputMode(1);
//this->m_MSCom->put_Settings(L"115200,n,8,1");
this->m_MSCom->put_Settings(csParater);
this->m_MSCom->put_RThreshold(1);
this->m_MSCom->put_InputLen(0);
...全文
1213 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinayu2007 2017-07-06
  • 打赏
  • 举报
回复
可以在任务管理器里看看,进程是否真的退出?
huan_88 2017-07-06
  • 打赏
  • 举报
回复
引用 13 楼 liudonghai11 的回复:
[quote=引用 12 楼 huan_88 的回复:] m_ConnectMSCom->put_PortOpen(false); this->m_MSCom->put_PortOpen(true);为什么两个操作串口的变量不一样?不是只有一个串口控件吗?
不同的线程,参数有传递。。[/quote] 你参数传递这里是不是有问题,我的程序里频繁打开关闭串口也不会有问题,还是再仔细调试下吧。。。
huan_88 2017-07-05
  • 打赏
  • 举报
回复
我之前用串口也没见过这样的情况 while(m_ConnectMSCom->get_PortOpen()) { AfxMessageBox(L"关闭串口"); m_ConnectMSCom->put_PortOpen(false); //Sleep(10); } 为什么要用while呢,直接用if不就好了吗,你把弹框那里全去掉再调试一下试试。
赵4老师 2017-07-05
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
schlafenhamster 2017-07-05
  • 打赏
  • 举报
回复
看看你创建 UI线程 的 代码。 注意主程序本身就是一个 UI线程。 if ((m_pThreadWrite=AfxBeginThread(CommWatchWrite,this))==NULL) // a work thread . to write bytes to comm UINT CDload::CommWatchWrite(LPVOID lpParam) { // return 0=OK 1=error CString txtout; CDload *pDload=(CDload*)lpParam; UINT nTxBufLen=0; WORD BytesWritten=0; WORD BlockCount=0; // open file and read CFile ArcFile; ArcFile.Open(pDload->SelectedFileName,CFile::modeRead); ULONG flen=ArcFile.GetLength(); // read whole file BYTE *read_buf=new BYTE[flen]; ArcFile.Read(read_buf,flen); ArcFile.Close(); // start down load while (flen>0 ) // { if (!pDload->m_bConnected) break; // write block after block if (flen>=BUFLEN) nTxBufLen=BUFLEN; else nTxBufLen=flen;// the rest flen-=nTxBufLen;// minimun =0 BytesWritten=pDload->WriteCommBlock(&read_buf[BlockCount*BUFLEN],nTxBufLen); BlockCount++; if (BytesWritten>0) { // writting OK tell main to show ResetEvent(pDload->m_hPostEventWrite);// first reset BOOL posted=pDload->PostMessage(WM_COMMNOTIFY, (WPARAM)1, // "WatchWrite" MAKELONG(BytesWritten,BlockCount)); // wait answer WaitForSingleObject(pDload->m_hPostEventWrite,0xFFFFFFFF); } else { // BytesWritten=0.An error pDload->m_bLoadStop=1;// failed if (read_buf) delete [] read_buf; return 1;// error } if( flen==0) // finish { pDload->m_bFinish=1; break; } } if (read_buf) delete [] read_buf; return 0;// return OK and auto-deleted }
liudonghai11 2017-07-05
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
"一个UI线程中添加了一个MSComm控件" 为什么 用 UI线程 ? 用 工作者线程 (worker)
因为这个控件所在的UI本身就是一个需要退出和重进的UI线程。
liudonghai11 2017-07-05
  • 打赏
  • 举报
回复
引用 12 楼 huan_88 的回复:
m_ConnectMSCom->put_PortOpen(false); this->m_MSCom->put_PortOpen(true);为什么两个操作串口的变量不一样?不是只有一个串口控件吗?
不同的线程,参数有传递。。
huan_88 2017-07-05
  • 打赏
  • 举报
回复
m_ConnectMSCom->put_PortOpen(false); this->m_MSCom->put_PortOpen(true);为什么两个操作串口的变量不一样?不是只有一个串口控件吗?
liudonghai11 2017-07-05
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
Tne device is not open”. 是在哪提示的,检查那边的代码,这个提示肯定不是在你open或close的代码产生的,肯定是你在close后产生的
如上,在我第一次关闭串口以后,第二次调用 this->m_MSCom->put_PortOpen(true);函数的时候,就会报错。
liudonghai11 2017-07-05
  • 打赏
  • 举报
回复
引用 8 楼 huan_88 的回复:
我之前用串口也没见过这样的情况 while(m_ConnectMSCom->get_PortOpen()) { AfxMessageBox(L"关闭串口"); m_ConnectMSCom->put_PortOpen(false); //Sleep(10); } 为什么要用while呢,直接用if不就好了吗,你把弹框那里全去掉再调试一下试试。
点错了,丢了块砖。。。。。 我用while是网上说有可能关闭失败,所以我就用了个while,现在可以确定关闭时成功,我在关闭UI线程以后,其他串口工具是可以访问串口的,还是MSCom控件的问题,第一次使用完以后,已经被成功关闭了,线程也被关闭了,但是我重新启动这一UI线程,代码会重复第一次的操作,走到上面 this->m_MSCom->put_PortOpen(true);重新去打开串口的时候就会报“the device is not open”的错误。
worldy 2017-07-05
  • 打赏
  • 举报
回复
Tne device is not open”. 是在哪提示的,检查那边的代码,这个提示肯定不是在你open或close的代码产生的,肯定是你在close后产生的
schlafenhamster 2017-07-04
  • 打赏
  • 举报
回复
"一个UI线程中添加了一个MSComm控件" 为什么 用 UI线程 ? 用 工作者线程 (worker)
liudonghai11 2017-07-04
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
串口打开 成功后 设置 标记 m_bConected= TRUE; 关闭时 判别 m_bConected ,清楚 错误 再 关闭
你这个m_bConnected是自己设置一个flag?我现在的问题是不关闭UI线程的时候,断开、重连是好的,如果关闭UI线程就会有问题。
zgl7903 2017-07-04
  • 打赏
  • 举报
回复
UI关闭时 先关闭端口
schlafenhamster 2017-07-04
  • 打赏
  • 举报
回复
串口打开 成功后 设置 标记 m_bConected= TRUE; 关闭时 判别 m_bConected ,清楚 错误 再 关闭

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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