CMSComm:SetPortOpen(FALSE)程序被卡

鄢老 2012-03-29 04:37:30
源代码如下:
int CECGSerialPortDlg::StartServer()
{
m_MSComm.SetCommPort(m_stECGSerialPort.iPort);
if (TRUE == m_MSComm.GetPortOpen())
{
m_MSComm.SetPortOpen(FALSE);
}
if (FALSE == m_MSComm.GetPortOpen())
{
m_MSComm.SetPortOpen(TRUE);
}

if (FALSE == m_MSComm.GetPortOpen())
{
AfxMessageBox("Failed to open serial port.");
return 1;
}

m_MSComm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取   
m_MSComm.SetInputMode(1);//以二进制方式读写数据   
m_MSComm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_MSComm.SetInputLen(0); //设置当前接收区数据长度为0
m_MSComm.GetInput();//先预读缓冲区以清除残留数据

char szSettings[MAX_PATH] = {0};
sprintf(szSettings,"%d,%c,%d,%d",m_stECGSerialPort.iBaudRate,(char)m_stECGSerialPort.iParity,
m_stECGSerialPort.iBitCount,m_stECGSerialPort.iStopBitCount);
m_MSComm.SetSettings(szSettings);

return 0;
}

int CECGSerialPortDlg::StopServer()
{
if (m_bInitDlg && m_MSComm.GetPortOpen())
{
m_MSComm.GetInput();//先预读缓冲区以清除残留数据
m_MSComm.SetOutBufferCount(0);

m_MSComm.SetPortOpen(FALSE);//被卡
}
return 0;
}
...全文
285 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdg3707 2012-03-30
  • 打赏
  • 举报
回复
会不会"带有CMSComm的对话框"已关闭了你才调用StopServer(),如果是这样,那肯定是出错的,因为对话框已关闭也,MSCOMM控件也就不存在了.你试试先调用StopServer()这个函数,然后再执行退出程序的菜单
wyx100 2012-03-30
  • 打赏
  • 举报
回复
因为不知道CECGSerialPortDlg类是在哪个类里调用的,不知道是不是在App类里的初始化函数创建.现在不管在哪个类里创建,你先这么试试:
如果你的工程是对话框,你就在对话框里的OnDestroyWindow(好象是这个函数,记不清楚了)或DestroyWindow这个函数里,调用StopServer。
如果工程是视图,你就在视图里的析构函数里调用StopServer
鄢老 2012-03-30
  • 打赏
  • 举报
回复
呵呵,我专门做了一个非dll的对话框程序,主对话框调用带有CMSComm的不可见动态对话框,正常。
另外,那个DLL在vs2010的一个工程里调用也正常
就是在VS6的一个工程里调用,才会被卡。
做了这么多年程序,还没见过这么奇怪的事。
wshcdr 2012-03-30
  • 打赏
  • 举报
回复
那看下能不能抓下当时的调用栈,来确认这个问题
hdg3707 2012-03-29
  • 打赏
  • 举报
回复
我记得在DesgtroyWindow里销毁一些资源没问题,在OnDestroy里好象会出问题,你试试在DestroyWindow里试试
hdg3707 2012-03-29
  • 打赏
  • 举报
回复
因为不知道CECGSerialPortDlg类是在哪个类里调用的,不知道是不是在App类里的初始化函数创建.现在不管在哪个类里创建,你先这么试试:
如果你的工程是对话框,你就在对话框里的OnDestroyWindow(好象是这个函数,记不清楚了)或DestroyWindow这个函数里,调用StopServer。
如果工程是视图,你就在视图里的析构函数里调用StopServer
鄢老 2012-03-29
  • 打赏
  • 举报
回复
说明:
CECGSerialPortDlg是在DLL中被动态建立,看不到界面,App的ExitInstance中触发在CECGSerialPortDlg,在OnDestroy中调用StopServer
自己做过实验,在非DLL的程序中不存在问题,估计是DLL中资源的问题,目前不知道怎么改
如果分数不够,可以增加

3,248

社区成员

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

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