首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

CMSComm:SetPortOpen(FALSE)程序被卡,该怎么解决

2012-05-05 
CMSComm:SetPortOpen(FALSE)程序被卡源代码如下:int CECGSerialPortDlg::StartServer(){m_MSComm.SetCommP

CMSComm:SetPortOpen(FALSE)程序被卡
源代码如下:
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;
}

[解决办法]
因为不知道CECGSerialPortDlg类是在哪个类里调用的,不知道是不是在App类里的初始化函数创建.现在不管在哪个类里创建,你先这么试试:
如果你的工程是对话框,你就在对话框里的OnDestroyWindow(好象是这个函数,记不清楚了)或DestroyWindow这个函数里,调用StopServer。
如果工程是视图,你就在视图里的析构函数里调用StopServer
[解决办法]
那看下能不能抓下当时的调用栈,来确认这个问题
[解决办法]
因为不知道CECGSerialPortDlg类是在哪个类里调用的,不知道是不是在App类里的初始化函数创建.现在不管在哪个类里创建,你先这么试试:
如果你的工程是对话框,你就在对话框里的OnDestroyWindow(好象是这个函数,记不清楚了)或DestroyWindow这个函数里,调用StopServer。
如果工程是视图,你就在视图里的析构函数里调用StopServer 

[解决办法]
会不会"带有CMSComm的对话框"已关闭了你才调用StopServer(),如果是这样,那肯定是出错的,因为对话框已关闭也,MSCOMM控件也就不存在了.你试试先调用StopServer()这个函数,然后再执行退出程序的菜单

热点排行