C# 上位机 崩溃 2019-12-8
知识点
异常处理机制
try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。
throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。抛出异常意味着可以自定义异常消息,可以将异常处理的方法交给外部,内部只需要将异常出现时出现的原因(消息)告诉(比较简单的使用时throw(new ApplicationException(“字符串”)))外部就好了。
简单来说,对于一个可能出现问题的函数/过程我们用
try{
内容
}catch(exception e)
{
出现问题后我们的处理方案
}
问题&BUG
硬件设备不在身边,串口收发数据方面出现问题,根据描述可以将错误定位在以下几个方面:
- DLL函数调用出错
- 下位机数据发送太快,出现粘包
- 信号量或者互斥锁释放异常
过程及解决方案
- 过程
询问另一个工程师发现是VC14动态库没有安装,安装了之后发现还是运行到调用动态链接库的部分会出错,之后用另一个Qt编写的C++动态库测试程序在虚拟机测试(原环境中因为运行库都装好了无法检测问题),可以运行。之后再用VS2019写了个C++程序发现在虚拟机中运行不了,提醒错误。同时在一个博客中发现了一个神器:Dependency Walker
。可以列出程序中的依赖链接库。
- 结论:
VC14运行库丢失
。是因为我重写的DLL是在VS环境下写的,编译出来的DLL本身就需要很多依赖库 - 解决方案:重新在VC6.0里面重编译DLL。
- 过程
由于手头上没有设备,自己重新用C# 写了个模拟下位机动作的程序。上位机发送指令后下发现下位机连续发送两个包(第一个确认包,第二个数据包)经常会出现重包和粘包,由于大体逻辑已经固定了,时间比较赶,简单的处理了一下,成功。
- 结论:自己写的框架有问题
- 解决方案:重新下发重新接受数据包的指令,
将下位机连续发送两个包中的第二个包忽略
。由于有多个包,原本的用计数的方式逻辑上有点复杂,最后采取只要收到最后一个包
就说明收包结束。同时增加一个工作日志,将自己收到的包数记录下来方便后续排查错误。
- 过程
同样因为手头没有设备,为了更好的定位错误内容,在可能出现错误的地方用都用try进行异常处理一下,在最后可以很快的找到问题。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment