你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32中 CAN接收中断里为什么每次接收到的第一次数据都是...

[复制链接]
shengxiaozhu 提问时间:2020-12-26 10:34 /
  1. u8 j=0;
  2. u8 sun2=0; // 数据包数
  3. u8 buf2[CAN_BUF_LENGTH]={0}; //记录can2接收到的原始数据
  4. u8 temp2[CAN_BUF_LENGTH]={0}; //记录can2重组后的有效数据
  5. u8 k=0;
  6. int count2=0; //有效数据个数
  7. void CAN2_RX0_IRQHandler(void)
  8. {
  9. CanRxMsg RxMessage;
  10. int i=0;


  11. CAN_ClearITPendingBit(CAN2,CAN_IT_FMP0);
  12. CAN_Receive(CAN2, 0, &RxMessage);

  13. if(RxMessage.Data[1]==0x01)
  14. {
  15. sun2= RxMessage.Data[2] ;        
  16. }


  17. //接收can的原始数据
  18. for(i=0;i<8;i++)
  19. {
  20. buf2[j] =RxMessage.Data[i];        
  21. //        printf("rxbuf2[%d]:%0x\r\n",j,        buf2[j]);        
  22. j++;        
  23. }

  24. //重新组包数据        
  25. if(j>7)
  26. {
  27. memTomem(temp2+k,buf2+j,8);

  28. for(i=0;temp2[k]!=0&&i<8;i++)
  29. {        
  30. printf("rxbuf3[%d]:%0x\r\n",k,        temp2[k]);     //开发板断电在上电,这里每次第一次打印temp2时都是空,就是什么都不输出,是什么原因呢? </font>
  31. k++;
  32. count2++;
  33. }        

  34. }

  35. if(sun2==0)//是否接收完当前报文帧数
  36. {        

  37. j=0;//将数组下标还原为0
  38. k=0;        
  39. count2=0;        
  40. }
  41. sun2--;        

  42. }
复制代码


收藏 评论4 发布时间:2020-12-26 10:34

举报

4个回答
shengxiaozhu 回答时间:2020-12-26 10:39:04
问题在37行,请大佬们帮忙看下,是不是我哪里写的不对?
废鱼 回答时间:2020-12-26 14:10:14
memTomem(temp2+k,buf2+j,8);
这里写的是不是有问题?总是把buf2中最后的地址copy到temp2.
从代码上看比较乱,如果只是简单的数据入队,没必要这么麻烦,可以参考ring.c这种循环队列。
也可以直接用memcpy(temp2+k,RxMessage.Data,8);没必要在中间再倒一次手吧。
shengxiaozhu 回答时间:2020-12-28 08:34:30
安 发表于 2020-12-26 14:10
memTomem(temp2+k,buf2+j,8);
这里写的是不是有问题?总是把buf2中最后的地址copy到temp2.
从代码上看比较 ...

大佬,这里是做了一个把接收到的原始数据重新做了组包,因为要筛选出里面需要的数据,
废鱼 回答时间:2020-12-28 09:28:18
楼主,其他的我只是建议,终端中尽量少做这些处理,交由中断外处理。
memTomem(temp2+k,buf2+j,8);检查这个函数,j时增加后的数。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版