在2812上实现CAN通信的问题

2019-03-26 15:15发布

我做了一个基于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;
}
请高手能不能帮我分析分析错误报文是怎么发生的,多谢了。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。