各位高手,我用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有没有对应的东西。
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有没有对应的东西。
Sleep(100);//试试看
}while(C51[0]!=0xff); 另外,你的这种情况应该不是死机,只是程序死了
可以参考AfxBeginThread函数
主程序一直在跑while,
已经不能够进行消息循环了,
所以即使下位机已经完成,通知了主程序,
但主程序在跑while,不能把消息传递给函数,
(MFC,刚刚入门,说错了不要笑,呵呵)推荐多线程,或自己调用OnCommunication