各位高手,我用VC写了一个程序,其中有一个地方涉及串口通信。我的目的是要进行某一步骤前先发送一条指令给下位机(单片机),单片机响应后把现场状态回传给上位机,直到某一数据有效后(假设C51[0]==0xff)流程才往下走。下列为我写的程序,但是我这样做就死机了,我初步认为是do~while占CPU太多所致。请大家帮忙解决。
void CC51commDlg::OnComm()//菜单函数——点选菜单时的处理程序 
{
// TODO: Add your command handler code here
   OnButton1();//是一个按钮的响应函数,运行后就传递一条指令给下位机,
              //下位机收到指令后马上回传响应,接收下位机的数据是在上位机的
              // LONG CC51commDlg::OnCommunication(WPARAM ch, LPARAM port)
              //函数中进行。在该函数中更改C51[]数组元素值。
//上下位机通信都没问题,我测试过了,大家不用考虑。
   
   do {

}while(C51[0]!=0xff);  // C51[0]!=0xff一直在查询C51[0],直到C51[0]==0xff流程
                    //才往下走
   
  MessageBox("传输数据正确");//这条语句主要是来验证流程是否顺利走下来
  
}
LONG CC51commDlg::OnCommunication(WPARAM ch, LPARAM port)
{

if (port <= 0 || port > 4)
return -1; if(ch=='S')
{
     bln_flg=TRUE;
 count=0;     //C51
    
}
else
{
if(bln_flg==TRUE)
{  C51[count]=ch;
   count=count+1;
   if(count>2)
   {
bln_flg=FALSE;
    count=0;
CString strr,str;
for(int n=0;n<3;n++)
{
             strr.Format("%x",C51[n]);
 str+=strr;
}
m_51edit=str;
            //m_ctr51edit.UpdateData(FALSE);
//m_ctr51edit.ShowWindow(1);
   UpdateData(FALSE);     } }


}

return 0;
}VB中有个DoEvents,在VB中把语句把上述do~while语句对应改写成
DO
   DoEvents
Loop Until XXXX  
不会导致死机,不知VC有没有对应的东西。

解决方案 »

  1.   

    do { 
    Sleep(100);//试试看
    }while(C51[0]!=0xff); 另外,你的这种情况应该不是死机,只是程序死了
      

  2.   

    你应该判断一下通信事件,引起OnComm()的事件很多,不一定是收到数据。
      

  3.   

    检查单片机有没有响应(示波器),如果有那是程序有问题,最大的可能是C51变量被优化了,请给它加上"volatile"修饰符.
      

  4.   

    循环中加一个GetMessage/DispatchMessage消息泵;
      

  5.   

    最好采用多线程方式,在相应菜单函数里启用一个专用线程用于检查单片机状态
    可以参考AfxBeginThread函数
      

  6.   

    我认为:
    主程序一直在跑while,
    已经不能够进行消息循环了,
    所以即使下位机已经完成,通知了主程序,
    但主程序在跑while,不能把消息传递给函数,
    (MFC,刚刚入门,说错了不要笑,呵呵)推荐多线程,或自己调用OnCommunication