我做了一个基于CAN总线的通信程序,从上位机定时接收控制指令,但大概每过3、4个小时就会收到一帧错误报文。这个问题困扰我了很久,一直解决不了,请哪位大侠帮忙指点指点,多谢了。
问题是这样的,我用19号can邮箱从上位机接收数据,接收的数据为0x11 11 11 11 11 11 11 11,但过一段时间,就会收到0x00 11 11 11 11 11 11 11这样的错误报文,而且根据测试程序看,当发现有错误报文时,立马重新读取,就能读到正确的数据。下面是我的测试程序:
//CANopenTestBuffer为40*8的二维数组,前20*8用来记录发现错误报文后,重新从寄存器读取的数据,后20*8用来记录第一次读错的数据
//另外,设置控制寄存器OPC=1,即当can寄存器数据未被读取前,新到数据是不能覆盖旧数据的
if(ECanaRegs.CANRMP.bit.RMP19==1)
{
TTCANopenRECBuffer[0]=ECanaMboxes.MBOX19.MDL.byte.BYTE0;
TTCANopenRECBuffer[1]=ECanaMboxes.MBOX19.MDL.byte.BYTE1;
TTCANopenRECBuffer[2]=ECanaMboxes.MBOX19.MDL.byte.BYTE2;
TTCANopenRECBuffer[3]=ECanaMboxes.MBOX19.MDL.byte.BYTE3;
TTCANopenRECBuffer[4]=ECanaMboxes.MBOX19.MDH.byte.BYTE4;
TTCANopenRECBuffer[5]=ECanaMboxes.MBOX19.MDH.byte.BYTE5;
TTCANopenRECBuffer[6]=ECanaMboxes.MBOX19.MDH.byte.BYTE6;
TTCANopenRECBuffer[7]=ECanaMboxes.MBOX19.MDH.byte.BYTE7;
if(TTCANopenRECBuffer[0]!=CANopenMBRECBuffer1[0])//以数据变化为判断错误依据
{//当有错误报文时
TrecCounter++;
CANopenMBRECBuffer1[0]=TTCANopenRECBuffer[0];
//当有错误报文发生时,就重新从can寄存器读取数据,存入数组CANopenTestBuffer[testIndex]中
CANopenTestBuffer[testIndex][0]=ECanaMboxes.MBOX19.MDL.byte.BYTE0;
CANopenTestBuffer[testIndex][1]=ECanaMboxes.MBOX19.MDL.byte.BYTE1;
CANopenTestBuffer[testIndex][2]=ECanaMboxes.MBOX19.MDL.byte.BYTE2;
CANopenTestBuffer[testIndex][3]=ECanaMboxes.MBOX19.MDL.byte.BYTE3;
CANopenTestBuffer[testIndex][4]=ECanaMboxes.MBOX19.MDH.byte.BYTE4;
CANopenTestBuffer[testIndex][5]=ECanaMboxes.MBOX19.MDH.byte.BYTE5;
CANopenTestBuffer[testIndex][6]=ECanaMboxes.MBOX19.MDH.byte.BYTE6;
CANopenTestBuffer[testIndex][7]=ECanaMboxes.MBOX19.MDH.byte.BYTE7;
//当有错误报文发生时,把读到到的错误报文存入数组CANopenTestBuffer[testIndex+20]中
CANopenTestBuffer[testIndex+20][0]=TTCANopenRECBuffer[0];
CANopenTestBuffer[testIndex+20][1]=TTCANopenRECBuffer[1];
CANopenTestBuffer[testIndex+20][2]=TTCANopenRECBuffer[2];
CANopenTestBuffer[testIndex+20][3]=TTCANopenRECBuffer[3];
CANopenTestBuffer[testIndex+20][4]=TTCANopenRECBuffer[4];
CANopenTestBuffer[testIndex+20][5]=TTCANopenRECBuffer[5];
CANopenTestBuffer[testIndex+20][6]=TTCANopenRECBuffer[6];
//CANopenTestBuffer[testIndex+20][7]=CANopenMBRECBuffer[7];
testIndex=(testIndex+1)%20;
if(ECanaRegs.CANRML.bit.RML19==1)
CANopenTestBuffer[20][7]++;
}
ECanaRegs.CANRMP.all = 0;
ECanaRegs.CANRMP.bit.RMP19=1;
}
请高手能不能帮我分析分析错误报文是怎么发生的,多谢了。
此帖出自
小平头技术问答
一周热门 更多>