求助高手!我用VC写了一向单片机采集数据的程序,采用GPIB接口通信,调用了Agilent visa中的函数.程序运行一会就没有任何提示莫名其妙的自动关闭了.有时候运行几秒就关闭了有时运行几分钟才关闭.关闭的时候是没有任何提示信息的.请问下大家什么情况会出现让程序莫名其妙的关闭呢?
代码如下
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
CNTDlg* pDlg = (CNTDlg*) lpParameter;
char buf [256] = {0};
CString message;
int m_Err = 0;
while(1)
{
if (pDlg->m_Start)
{
while ((viScanf(pDlg->vi, "%t", buf) != VI_SUCCESS))//就是这句会让程序自动关闭
{
m_Err++;
if (m_Err == 1)
{
break;
}
}
if (m_Err == 1)
{
m_Err = 0;
AfxMessageBox("数据接收出现错误,可能仪器已经关闭,或者通信电缆没插好!”");
pDlg->KillTimer(1);
pDlg->m_Start = false;
viClose(pDlg->vi);
viClose(pDlg->defaultRM); break;
} //这里是一些将接收到的数据处理代码

Sleep(500);
} } return 0;
}
让程序自动关闭的代码我也已经找到while ((viScanf(pDlg->vi, "%t", buf) != VI_SUCCESS))
就是这句,去掉程序就不会自动关闭原因我也已经基本查明,可能是PC请求单片机数据的时候时间过长,因为单片机程序中我用了中断,中断程序执行时间稍微过长就会出现那样的问题,把中断去掉或在中断中只加两三句话一切正常.应该是单片机正在和PC通信的时候受到了中断.
单片机程序我不能改动,中断一定需要并且时间也不好改,我只能改PC机程序。PC上数据接收都是正确的,就仅仅是莫名其妙的关闭,请问有什么好的解决方法呢?谢谢!

解决方案 »

  1.   

    while ((viScanf(pDlg->vi, "%t", buf) != VI_SUCCESS)) 这句上设断点...F5..看出错信息...
      

  2.   

    char buf [256] = {0};有没有考虑越界问题?
      

  3.   

    单片机每次只发了四个数据过来,buf[256]应该不会越界啊,我改成1000都试过一样的.就是没有任何提示信息的啊.出错是随机的,所以单步调试的话很难看到错误.应该是参数传的有问题,但是为什么程序会自动关闭呢?
    我改成了这样
    while ((viScanf(pDlg->vi, "%c%c%c%c", &buf[0],&buf[1],&buf[2],&buf[3]) != VI_SUCCESS))
    程序不会自动关闭了,但是运行一会儿还是会出错.这次虽然不关闭,但几分钟后采集的数据都不对了。
      

  4.   

    可以在while循环完成后设断点,查看pDlg->m_Start的值,以判断是否线程正常结束
      

  5.   

    你的timer函数里面处理的什么?是不是也有操作vi,但是你没有同步资源,所以会有问题
      

  6.   

    viScanf是个什么函数啊,有"%t"格式化的标志吗,是不是写错了,应该是"%s"
      

  7.   

    谢谢这么多人给我提供意见和帮助.timer函数里我只写了个UpdateData(false);用来刷新界面.viScanf是VISA中的函数,我是按照它的数据手册上的例子来写的.%s只能取得buf[0].后面的就一直为0了,pDlg->m_Start的值我是通过点击按钮来改变的,其他地方不会改变。那是不是发生异常程序自动关闭了呢?怎样来捕捉这异常呢,我要让异常的时候忽略不取值,下一次又自动重新取数据.
      

  8.   

    问题已解决.PC程序很少写,所以也是第一次在CSDN上发帖,第一次就这么多朋友帮忙,真是感谢!PC上程序太难搞了,我还是改了单片机程序,看了下自动汇编出来的中断部分代码,发现实在太臃肿烦琐,难怪中断时间过长,我将那代码重新优化改写了下就很稳定了。