文章目录
背景介绍
在一个嵌入式软件项目中,有一段使用C语言写的嵌入式代码,功能是把CAN总线上的几帧报文接收进来,并解析出数据。示例如下:
乍一看感觉挺简单,想着直接用一个while循环,周期提取CAN buffer中缓存的数据就行了。但是就这么一个小应用让我栽了跟头,在整个工程中排查了几个小时才找到问题,下面就来分享一下这一小段个人经历。
一开始代码调试的时候很顺利,一共接收5帧报文,总共40个信号,相关代码大概是下面这个样子:
void main(void)
{
//省略若干行
if(Timer10ms == 1){
do{
ret = GetCANFrame(1, &Ext, &ID, &Length, &DataBuf);
if(ret){
if(ID == 0x100){
memcpy(&SignalArray[0], DataBuf, 8)
}
if(ID == 0x101){
memcpy(&SignalArray[8], DataBuf, 8)
}
if(ID == 0x102){
memcpy(&SignalArray[16], DataBuf, 8)
}
if(ID == 0x103){
memcpy(&SignalArray[24], DataBuf, 8)
}
if(ID == 0x104){
memcpy(&SignalArray[32], DataBuf, 8)
}
}
}while(ret && (i <= 100))
}
//省略若干行
}