读书人

MFC对话框程序开线程读串口界面卡主

发布时间: 2013-08-24 13:17:55 作者: rapoo

MFC对话框程序开线程读串口,界面卡主解决方案
本帖最后由 VisualEleven 于 2013-08-09 12:21:02 编辑

DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
while(true)
{
DWORD SIZE;
COMSTAT ComStat;
DWORD dwErrorFlags;
memset(buff, 0, sizeof(buff));
ClearCommError(hcom,&dwErrorFlags,&ComStat);
bReadStat= ReadFile(hcom,buff,22,&SIZE,NULL);TRACE1("hcom=%d",hcom);
if(bReadStat)
{
CString temp;
m_ctrlMyRichEdit.ReplaceSel(_T("\r\n"));
SetTime();
if(buff[0]==6||buff[0]==21)
{temp.Format(_T("%02X "),buff[0]);
AppendText((BYTE*)temp.GetBuffer(0),20,RGB(255, 0,0));
}
else
{
for(int i=0;i< sizeof(buff);i++)
{
temp.Format(_T("%02X "),buff[i]);
AppendText((BYTE*)temp.GetBuffer(0),24,RGB(255, 0,0));
}
BuildData(buff);
}
}
PurgeComm(hcom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

}
ExitThread(0);
return 0;
}

用While(true)实时监控串口是否有返回数据,现在一点击按钮就卡的半死,更改读串口超时也是不太好,怎么解决这个头疼的问题呢?谢谢
[解决办法]




引用:
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
while(true)
{
DWORD SIZE;
COMSTAT ComStat;
DWORD dwErrorFlags;
memset(buff, 0, sizeof(buff));
ClearCommError(hcom,&dwErrorFlags,&ComStat);
bReadStat= ReadFile(hcom,buff,22,&SIZE,NULL);TRACE1("hcom=%d",hcom);
if(bReadStat)
{
CString temp;
m_ctrlMyRichEdit.ReplaceSel(_T("\r\n"));
SetTime();
if(buff[0]==6
[解决办法]
buff[0]==21)
{temp.Format(_T("%02X "),buff[0]);
AppendText((BYTE*)temp.GetBuffer(0),20,RGB(255, 0,0)); //这个难道不是用的m_ctrlMyRichEdit????,
//是否也是调用SendMessage完成的???


}
else
{
for(int i=0;i< sizeof(buff);i++)
{
temp.Format(_T("%02X "),buff[i]);
AppendText((BYTE*)temp.GetBuffer(0),24,RGB(255, 0,0));
}
BuildData(buff);
}
}
PurgeComm(hcom, PURGE_TXABORT
[解决办法]

PURGE_RXABORT
[解决办法]
PURGE_TXCLEAR
[解决办法]
PURGE_RXCLEAR);

}
ExitThread(0);
return 0;
}


用While(true)实时监控串口是否有返回数据,现在一点击按钮就卡的半死,更改读串口超时也是不太好,怎么解决这个头疼的问题呢?谢谢



1)
ExitThread(0);

return 0;
效果差不多,除非线程函数调用了别的函数;
在那个函数里直接退出线程,否则没有必要使用ExitThread(0);

2)while(true)
这个线程没有推出条件,难道一直工作?
3)
每次只读22个字节数据,就刷新界面,是否刷新太快了??
串口虽然慢,读22个字节还是很快的。
4)
AppendText在干啥???
5)sizeof (buf) 是多少,每次只读22个字节,为何循环终止条件是i<sizeof (buf)
6)BuildData(buff);做些什么???
7)SetTime();做些什么???设置超时???
8)点击按钮都干了啥????
如果启动线程,那么点击两次,就会启动2个线程工作,每个线程,都无法退出。
点击N此,会启动N个线程工作,这个问题如何解决????
PS:
以上这些问题,在你的代码里都看不出来,所以看不出哪里会卡界面,需要你自己检查一下!


[解决办法]
1 界面卡和读线程关系不大,问题在别处。
2 这与读超时关系不大。建议读线程稍作改动
while(true)
????{
????????DWORD?SIZE;
????????COMSTAT?ComStat;
????????DWORD?dwErrorFlags;
????????memset(buff,?0,?sizeof(buff));
????????ClearCommError(hcom,&dwErrorFlags,&ComStat);
if(ComStat->cbInQue < 22)////同步读串口,一样能判断ComStat.cbInQue
continue;
????????bReadStat=?ReadFile(hcom,buff,22,&SIZE,NULL);TRACE1("hcom=%d",hcom);
????????if(bReadStat)
????????{
????????????????CString?temp;
????????????????m_ctrlMyRichEdit.ReplaceSel(_T("\r\n"));
????????????????SetTime();
????????????????if(buff[0]==6
[解决办法]
buff[0]==21)
????????????????{temp.Format(_T("%02X?"),buff[0]);
????????????????AppendText((BYTE*)temp.GetBuffer(0),20,RGB(255,?0,0));???
????????????????}
????????????????else
????????????????{
????????????????????for(int?i=0;i<?sizeof(buff);i++)
????????????????????{
????????????????????????temp.Format(_T("%02X?"),buff[i]);
????????????????????????AppendText((BYTE*)temp.GetBuffer(0),24,RGB(255,?0,0));???????????


????????????????????????????????????????????}???
????????????????????BuildData(buff);
????????????????}
????????????????}
????????PurgeComm(hcom,?PURGE_TXABORT
[解决办法]

????????????PURGE_RXABORT
[解决办法]
PURGE_TXCLEAR
[解决办法]
PURGE_RXCLEAR);???
?????????
????}

读书人网 >VC/MFC

热点推荐