求助高手!VC写的程序没有任何提示就莫名其妙自动关闭了

yanggang2880 2009-04-20 10:05:59
求助高手!我用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上数据接收都是正确的,就仅仅是莫名其妙的关闭,请问有什么好的解决方法呢?谢谢!
...全文
328 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanggang2880 2009-04-21
  • 打赏
  • 举报
回复
问题已解决.PC程序很少写,所以也是第一次在CSDN上发帖,第一次就这么多朋友帮忙,真是感谢!PC上程序太难搞了,我还是改了单片机程序,看了下自动汇编出来的中断部分代码,发现实在太臃肿烦琐,难怪中断时间过长,我将那代码重新优化改写了下就很稳定了。
yanggang2880 2009-04-21
  • 打赏
  • 举报
回复
原因是单片机正在和PC通信的时候受到了中断,且中断时间很长.我现在就想求一个不让程序自动关闭的方法.就是忽略掉错误.有谁能提供一下这样的方法吗?谢谢!
yanggang2880 2009-04-21
  • 打赏
  • 举报
回复
谢谢这么多人给我提供意见和帮助.timer函数里我只写了个UpdateData(false);用来刷新界面.viScanf是VISA中的函数,我是按照它的数据手册上的例子来写的.%s只能取得buf[0].后面的就一直为0了,pDlg->m_Start的值我是通过点击按钮来改变的,其他地方不会改变。那是不是发生异常程序自动关闭了呢?怎样来捕捉这异常呢,我要让异常的时候忽略不取值,下一次又自动重新取数据.
贪玩的老鼠 2009-04-21
  • 打赏
  • 举报
回复
viScanf是个什么函数啊,有"%t"格式化的标志吗,是不是写错了,应该是"%s"
Conry 2009-04-20
  • 打赏
  • 举报
回复
你的timer函数里面处理的什么?是不是也有操作vi,但是你没有同步资源,所以会有问题
瓶盒 2009-04-20
  • 打赏
  • 举报
回复
可以在while循环完成后设断点,查看pDlg->m_Start的值,以判断是否线程正常结束
yanggang2880 2009-04-20
  • 打赏
  • 举报
回复
单片机每次只发了四个数据过来,buf[256]应该不会越界啊,我改成1000都试过一样的.就是没有任何提示信息的啊.出错是随机的,所以单步调试的话很难看到错误.应该是参数传的有问题,但是为什么程序会自动关闭呢?
我改成了这样
while ((viScanf(pDlg->vi, "%c%c%c%c", &buf[0],&buf[1],&buf[2],&buf[3]) != VI_SUCCESS))
程序不会自动关闭了,但是运行一会儿还是会出错.这次虽然不关闭,但几分钟后采集的数据都不对了。
greatws 2009-04-20
  • 打赏
  • 举报
回复
char buf [256] = {0};

有没有考虑越界问题?
liuzxchina 2009-04-20
  • 打赏
  • 举报
回复
是不是发生异常?或者参数的传递有问题?
rivershan 2009-04-20
  • 打赏
  • 举报
回复
while ((viScanf(pDlg->vi, "%t", buf) != VI_SUCCESS)) 这句上设断点...F5..看出错信息...

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧