知识点

丢包、重包、粘包的处理
日志系统你
信号量

问题&&BUG

  1. 下位机修改过了,发送数据丢包率增加了,导致信号量释放过多发生异常。大部分异常出现在开始测试的时候,因为需要先移动到对应位置才能开始扫描(移动到对应位置的命令就是开始测试),在接收这个应答的处理函数中会发送一个开始测试的信号量(提供给外部能够判断是否移动结束),但是在孵化结束的时候开始采集同时也需要开始测试协议,导致信号量实际释放得比原来的多。(实际表现在前一个卡正常测试,后一个卡会动一下就结束采集,以此类推)。
  2. 从sd卡中获得数据的时候会有错误(小概率事件),导致生成的sd卡文件为空,进而导致调用dll函数时出错。
  3. 自检和满卡的时候没有屏蔽操作
  4. sd卡检测线程无法检测到sd卡拔出操作
  5. 线程中的弹框无法暂停主线程的运行
  6. 程序中很多多余的标志位

解决方案及过程

  1. 在所有信号量释放的时候增加异常处理操作。
  2. 增加当sd卡插入获取数据时有错误时禁止覆盖原sd卡文件
  3. 在屏蔽操作中增加一个检测是否满卡的操作,当满卡的时候默认为屏蔽操作。
  4. 在检测线程中发送sd卡检测命令,同时增加一个SDisNew标志位,便于判断当前的sd卡是否为新插入的,如果是新插入的就执行后面的读取等操作,不是就直接退出。
  5. 暂未解决。
  6. 暂未解决。

心得体会

  1. 深刻体会到框架设计的重要性,还有一些可能导致错误的函数应该在设计初期就对其增加异常处理操作(尤其是信号量释放)。
  2. 数据丢包、重包、粘包这些老生常谈的问题,应该有一个好的解决方案在一开始,不要到最后调试的时候焦头烂额
  3. 程序日志系统的重要性(很重要!!),不要觉得打印个命令行就可以排错了,设计初期最好将所有动作阶段都加上增加一个本地日志记录,方便后续出现错误快速定位,不用再增加断点这样,有时候BUG是小概率事件,自己测试是找不到的,有时候用户使用过程中偶然出现的。
  4. 代码规范一点,注释多写一些,垃圾变量少写一点。