关于串口通讯的问题

freedom6688 2003-10-18 02:32:36
本人在项目中用了现有的写好的CSerialPort类,没有利用MSCOMM控件。现在遇到的问题是:当多的串口同时接收数据时,若想关闭某一串口:
port.StopMonitoring();
程序就会死掉,单步跟进去发现,StopMonitoring()这个函数中有问题:
BOOL CSerialPort::StopMonitoring()
{
if(m_bThreadAlive)
{
do
{
SetEvent(m_hShutdownEvent);
}
while (m_bThreadAlive);
TRACE("Thread ended\n");
}

if (m_hComm != NULL)
{
CloseHandle(m_hComm);
m_hComm = NULL;
}

return TRUE;

}
程序一直出不了do...while...这个循环,也就是说m_bThreadAlive一直不能被置为FALSE,请做过串口项目的高手指教,谢了~~!!!
...全文
35 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tinydrop 2003-10-24
  • 打赏
  • 举报
回复
你可以这样
do{
SetEvent(m_hShutdownEvent);
}while(WaitForSingleObject(hShutdownEvent,0)!=WAIT_TIMEOUT);
或者
HANDLE hShutdownEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
do{
SetEvent(m_hShutdownEvent);
}while(WaitForSingleObject(hShutdownEvent,0)!=WAIT_TIMEOUT);
我认为这是最简单的能实现你意图的方法。当然有别的更好(从效率考虑)方法,但实现
就没这么简单了。对于一个初学者来讲,我认为这是一个好的应急的实现方法。如果你有
兴趣可以参考别的书籍。


huanyun 2003-10-24
  • 打赏
  • 举报
回复
Event = WaitForMultipleObjects(3, pSerialComm->m_hEventArray, FALSE, INFINITE);
m_hEventArray必须包含m_hShutdownEvent

而且你要保证你得线程没有退出或者阻塞
或者退出时将m_bThreadAlive变为False
lzzqqq 2003-10-23
  • 打赏
  • 举报
回复
看来你的监控线程有问题,设置退出事件时不退出,
看一下监控线程中什么地方用了Waitfor系列函数,造成挂起无响应状态。改成WaitForMutiObject
并用你的退出事件作参数,使监控线程没有挂起的机会。
大体思路是这样的。具体还要见你的监控线程函数。
dhbo 2003-10-22
  • 打赏
  • 举报
回复
强烈关注,俺也在看串口通讯
scatzr 2003-10-21
  • 打赏
  • 举报
回复
程序的其他线程在关闭的时候没有将m_bThreadAlive设为false
duyhui 2003-10-20
  • 打赏
  • 举报
回复
do
{
SetEvent(m_hShutdownEvent);
}
while (m_bThreadAlive);
这个循环的意思,是不是所有串口都没有通信事件了,才把串口m_bThreadAlive置为FALSE。
所以,你要关闭一个串口,用这个方法不行吧,要单个判断
byyter 2003-10-18
  • 打赏
  • 举报
回复
看看事件m_hShutdownEvent的处理函数有没有把m_bThreadAlive置成False
wdllove 2003-10-18
  • 打赏
  • 举报
回复
我想那样做到底可行不?
huanyun 2003-10-18
  • 打赏
  • 举报
回复
上面的是初始化消息




下面的是线程处理
huanyun 2003-10-18
  • 打赏
  • 举报
回复
try
{
if (m_Overlapped.hEvent != NULL) ResetEvent(m_Overlapped.hEvent);
m_Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (m_hWriteEvent != NULL) ResetEvent(m_hWriteEvent);
m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (m_hShutdownEvent != NULL) ResetEvent(m_hShutdownEvent);
m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

m_hEventArray[0] = m_hShutdownEvent;
m_hEventArray[1] = m_Overlapped.hEvent;
m_hEventArray[2] = m_hWriteEvent;
return TRUE;
}
catch(...){ return FALSE;}









//等待信号量
Event = WaitForMultipleObjects(3, pSerialComm->m_hEventArray, FALSE, INFINITE);

switch (Event)
{
case 0: //断开端口连接信号
{
pSerialComm->m_bThreadAlive = FALSE;
AfxEndThread(100);
break;
}
case 1: ////读数据信号
{
GetCommMask(pSerialComm->m_hComm, &CommEvent);
if (CommEvent & EV_RXCHAR || CommEvent & EV_CTS) ReceiveChar(pSerialComm, comstat);
break;
}
case 2: //写数据信号
{
break;
}
}
wdllove 2003-10-18
  • 打赏
  • 举报
回复
我做了个短信发送的程序现在想把它做成dll,其中用到mscomm,与timer!
现在不知道怎么才能把这两个东西弄到dll里?
请大虾指教啦!
fatwave 2003-10-18
  • 打赏
  • 举报
回复
你应该贴出全部代码,这样才好分析!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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