回复【加群】,限时免费进入知识共享、技术交流群;
回复【3D封装库】,常用元器件的3D封装库;
回复【电容】,获取电容、元器件选型相关的内容;
回复【阻抗匹配】,获取电磁兼容性、阻抗匹配相关的资料
回复【资料】,获取全部电子设计、单片机开发相关的资料
回复【终端电阻】,获取CAN终端电阻相关的资料
回复【单片机】,获取单片机全套视频教程和参考设计
回复【STM32】,获取STM32相关设计和视频教程
回复【PCB】,获取PCB设计相关的资料
回复【硬件知识】、【硬件设计】,获取硬件开发工程必备手册
回复【经典电路】,获取5000个经典电路
回复【论文】,获取毕业设计、电子竞赛、学术专业等相关论文资料
回复【华为】,获取华为的硬件设计资料
…………
欢迎关注【玩转单片机与嵌入式】公众号,本公众号会每天输出高质量的技术干货文章,欢迎持续关注。
一:流程及问题
之前开发的一款产品,大致的工作流程如下图:
此处及下文中,为方便讲解,将我们的设备称为主设备,将其他设备称为从设备
这款产品,已经给客户批量供货很多台,一直没有收到客户的不良反馈。突然有天售后服务的同事说:客户反馈设备偶尔会一直初始化不成功,不能执行主任务流程。
二:问题排查
收到客户的反馈后,从软硬件各个方面进行了积极的排查:
排查硬件及使用环境
对出现问题的设备,烧写专门的硬件测试程序,检查各项硬件功能正常。排查出问题设备的各物料供应商批次等都没有发现有任何异常。
在主设备软件初始化时,会等待接收从设备的数据,怀疑从设备对主设备产生的影响,通过对比验证、排他性验证等各种排查方式,排除了从设备对主设备的影响。
在现场对设备间通信的数据进行数据监听发现,受干扰较大时,主设备与从设备通信时会受到随机的乱码。怀疑是干扰的乱码导致的初始化不成功。
排查软件
软件实现的大致方式如下代码所示。
#define MAX_LEN 64 //串口接收数据的最大个数
#define STATE_INIT 0 //初始化状态
#define STATE_OPERATING 0 //操作状态
uint8_t ucRxBuf[MAX_LEN]; //串口接收的数据
void function(void)
{
switch (MainState)
{
case STATE_INIT: //初始化
{
if(makeCRC(ucRxBuf) == ucRxBuf[MAX_LEN-1])
{
MainState = STATE_OPERATING;
}
}
break;
case STATE_OPERATING: //运行状态
{
}
break;
default:
break;
}
}
对数据监听发现,主设备与从设备通信时,初始化的握手仅进行一次。若首次握手成功,则主设备与从设备都进入到正常运行状态。
从代码中发现唯一可能出现初始化不跳转的情况是:主设备一直等待从设备握手不成功。如下图所示
问题随之而来:若从设备与主设备握手不成功时,从设备是否会再次发送握手信息?
三:问题根源
从设备上电后,发送一次握手信息,若主设备有握手成功的信息返回,从设备在本次上电周期不再发送第二次握手信息。
检查主设备的握手的返回信息发现:仅仅对数据长度进行了判断,判断接收到正确的数据长度就认为握手成功,即给从设备发送了握手成功的信息,没有实际按照CRC校验成功作为握手成功的标志。
但是,在主任务中通过CRC校验成功作为初始化成功的标志。
多么低级的bug啊。因为工程师的这个bug,导致公司被客户索赔并勒令进行立即整改。
End
限时免费扫码进群,交流更多行业技术
往期推荐
暂无评论哦,快来评论一下吧!