求解答!!0xc0000094,串口通讯问题!!!

qq_31382269 2018-11-29 08:55:17
最近接手了别人写的一个软件,运行环境是XP,外设是一台温度测量仪,程序里面含有串口通讯的功能。插上串口,正常通讯时,软件每次都运行13个小时左右后,就崩溃了,提示应用程序发生异常,未知软件错误 0xc0000094 !!!
当我把串口拔掉后,软件运行一整天也没问题,所以我判断是串口通讯这块代码的问题。不多说,先贴源码:
//串口通信
LONG CMainFrame::OnCommunication(WPARAM ch, LPARAM port)
{
int j;

//串口1,连接温度仪
for (j=0; j<4; j++) {
if (port==m_nPorts[j] && m_tyPorts[j]==PORT_TYPE_TEMP) {
if(ch == 10) //得到回车码,表示传输完毕
{
CString str,tstr;

str = m_strPortReceived[j];
m_strPortReceived[j] = "";
str.SetAt(str.GetLength()-1, '\0');
str.TrimLeft();
str.TrimRight();




if(str.Mid(0,2) == "!T") //?W 得到单色的温度 ?T 得到双色的温度
{
str = str.Mid(2);

int i;//i是用来存放获取的温度值,一般都为几千度,温度值也可能为字母,如EUUU
i = StrToInt(str);

//只有在发出查询指令后才处理接收到的数据
if (m_nTempQuery[j] > 0) {
m_nTempDetail[j][m_nTempDetailCount[j]-1] = i;

//去掉低于 10 的温度值
if(i < m_temp_expt_low) return 0;

//得到最大值
if(i>(int)m_fTempVal[j]) m_fTempVal[j]=(float)i;
}
}
}
else
{
m_strPortReceived[j] += (char)ch;

}

break;
}
}

1.怀疑过内存泄漏问题,但是观察过资源管理器中内存使用情况,占用内存很少且一直很稳定。
2.程序给串口每秒钟发送请求测量温度的命令 ?T (这是温度仪定义的请求指令,后面还有回车符表示发送完毕),返回是 !TEUUU或者!T1234(其中1234表示温度值,后面也有回车符,表接收完毕)。

真心求教各位大神,能否看出可疑之处,求帮助!!!
...全文
423 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevancheng 2018-11-30
  • 打赏
  • 举报
回复
出错写dump文件,再调试
Eleven 2018-11-30
  • 打赏
  • 举报
回复
打log输出到文件看看先~
oyljerry 2018-11-30
  • 打赏
  • 举报
回复
直接编译器断点跟踪调试,看具体出错的语句位置。
zgl7903 2018-11-29
  • 打赏
  • 举报
回复
按你提供的信息, 问题可能就出在接收数据后的处理上, 可以考虑在这一段里搜除号 / , 分析下前后代码

zgl7903 2018-11-29
  • 打赏
  • 举报
回复
VC6 的Release版本调试功能个人感觉太弱了
可以先编译成Debug版本, 但是VC6的异常 要在启动调试后才能打开, 那你可以在程序入口如 InitInstance 中设置一个断点, 调试运行,等程序停下来后 再在调试菜单中打开异常 再继续运行





qq_31382269 2018-11-29
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
0xC0000094L STATUS_INTEGER_DIVIDE_BY_ZERO 整数除0了
DEBUG模式, 异常中开启 Win32异常, 调试模式运行, 很容易捕捉到异常, 奔溃时结合调试堆栈修改解决之
eda 的值是3600,edx为0
qq_31382269 2018-11-29
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
0xC0000094L STATUS_INTEGER_DIVIDE_BY_ZERO 整数除0了
DEBUG模式, 异常中开启 Win32异常, 调试模式运行, 很容易捕捉到异常, 奔溃时结合调试堆栈修改解决之
因为是在release模式下运行,这个VC6.0好像找不到DEBUG模式设置,设置断点也命中不了。不过在它报错后我点击了调试,弹出了提示框确实是整数除0了,但是我没保存截图,最后一条记得好像是 mov eda,edx。 请问从我贴出的代码中能看出可能是哪出错了吗?
zgl7903 2018-11-29
  • 打赏
  • 举报
回复
0xC0000094L STATUS_INTEGER_DIVIDE_BY_ZERO 整数除0了
DEBUG模式, 异常中开启 Win32异常, 调试模式运行, 很容易捕捉到异常, 奔溃时结合调试堆栈修改解决之



schlafenhamster 2018-11-29
  • 打赏
  • 举报
回复
返回是 !TEUUU 时 表示什么 温度 ? 处理结果 会不会 =0 ?
schlafenhamster 2018-11-29
  • 打赏
  • 举报
回复
使用 debug 版本, 查找 哪里 有 除法 指令 。
zgl7903 2018-11-29
  • 打赏
  • 举报
回复
提示就是除0了, 一切皆有可能

qq_31382269 2018-11-29
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
按你提供的信息, 问题可能就出在接收数据后的处理上, 可以考虑在这一段里搜除号 / , 分析下前后代码
请问数组溢出的话会报上述错误吗?

16,472

社区成员

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

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

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