[应用相关] STM32中 CAN接收中断里为什么每次接收到的第一次数据都是...

[复制链接]
1054|8
 楼主| cr315 发表于 2021-1-6 17:24 | 显示全部楼层 |阅读模式
  • u8 j=0;
  • u8 sun2=0; // 数据包数
  • u8 buf2[CAN_BUF_LENGTH]={0}; //记录can2接收到的原始数据
  • u8 temp2[CAN_BUF_LENGTH]={0}; //记录can2重组后的有效数据
  • u8 k=0;
  • int count2=0; //有效数据个数
  • void CAN2_RX0_IRQHandler(void)
  • {
  • CanRxMsg RxMessage;
  • int i=0;
  • CAN_ClearITPendingBit(CAN2,CAN_IT_FMP0);
  • CAN_Receive(CAN2, 0, &RxMessage);
  • if(RxMessage.Data[1]==0x01)
  • {
  • sun2= RxMessage.Data[2] ;
  • }
  • //接收can的原始数据
  • for(i=0;i<8;i++)
  • {
  • buf2[j] =RxMessage.Data;
  • //        printf("rxbuf2[%d]:%0x\r\n",j,        buf2[j]);
  • j++;
  • }
  • //重新组包数据
  • if(j>7)
  • {
  • memTomem(temp2+k,buf2+j,8);
  • for(i=0;temp2[k]!=0&&i<8;i++)
  • {
  • printf("rxbuf3[%d]:%0x\r\n",k,        temp2[k]);     //开发板断电在上电,这里每次第一次打印temp2时都是空,就是什么都不输出,是什么原因呢? </font>
  • k++;
  • count2++;
  • }
  • }
  • if(sun2==0)//是否接收完当前报文帧数
  • {
  • j=0;//将数组下标还原为0
  • k=0;
  • count2=0;
  • }
  • sun2--;
  • }


[color=rgb(51, 102, 153) !important]复制代码










sjnh 发表于 2021-1-6 17:43 | 显示全部楼层
//接收can的原始数据
for(i=0;i<8;i++)
{
buf2[j] =RxMessage.Data;   这个操作
//        printf("rxbuf2[%d]:%0x\r\n",j,        buf2[j]);
j++;
}
还有,你在中断里干这么多事不好吧,特别是还有printf这个
xiaoqizi 发表于 2021-2-2 23:39 | 显示全部楼层
中断处理函数太庞大了
木木guainv 发表于 2021-2-2 23:42 | 显示全部楼层
永恒的乱码?
磨砂 发表于 2021-2-2 23:51 | 显示全部楼层
中断函数要尽可能简单
晓伍 发表于 2021-2-2 23:53 | 显示全部楼层
硬件上需要可靠接地 要不然也容易出现这种现象
八层楼 发表于 2021-2-2 23:54 | 显示全部楼层
都快要泡在中断出不来了
powerantone 发表于 2021-2-8 16:12 | 显示全部楼层
memTomem(temp2+k,buf2+j,8);
这里写的是不是有问题?总是把buf2中最后的地址copy到temp2.
从代码上看比较乱,如果只是简单的数据入队,没必要这么麻烦,可以参考ring.c这种循环队列。
也可以直接用memcpy(temp2+k,RxMessage.Data,8);没必要在中间再倒一次手吧。
laocuo1142 发表于 2021-2-8 16:13 | 显示全部楼层
楼主,其他的我只是建议,终端中尽量少做这些处理,交由中断外处理。
memTomem(temp2+k,buf2+j,8);检查这个函数,j时增加后的数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1466

主题

4964

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部