搜索
查看: 890|回复: 4

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

[复制链接]

该用户从未签到

12

主题

20

帖子

0

蝴蝶豆

高级会员

最后登录
2021-5-10
发表于 2020-12-26 10:34:24 | 显示全部楼层 |阅读模式
  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. }
复制代码


回复

使用道具 举报

该用户从未签到

12

主题

20

帖子

0

蝴蝶豆

高级会员

最后登录
2021-5-10
 楼主| 发表于 2020-12-26 10:39:04 | 显示全部楼层
问题在37行,请大佬们帮忙看下,是不是我哪里写的不对?
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2020-12-26 14:10:14 | 显示全部楼层
memTomem(temp2+k,buf2+j,8);
这里写的是不是有问题?总是把buf2中最后的地址copy到temp2.
从代码上看比较乱,如果只是简单的数据入队,没必要这么麻烦,可以参考ring.c这种循环队列。
也可以直接用memcpy(temp2+k,RxMessage.Data,8);没必要在中间再倒一次手吧。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

20

帖子

0

蝴蝶豆

高级会员

最后登录
2021-5-10
 楼主| 发表于 2020-12-28 08:34:30 | 显示全部楼层
安 发表于 2020-12-26 14:10
memTomem(temp2+k,buf2+j,8);
这里写的是不是有问题?总是把buf2中最后的地址copy到temp2.
从代码上看比较 ...

大佬,这里是做了一个把接收到的原始数据重新做了组包,因为要筛选出里面需要的数据,
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2020-12-28 09:28:18 | 显示全部楼层
楼主,其他的我只是建议,终端中尽量少做这些处理,交由中断外处理。
memTomem(temp2+k,buf2+j,8);检查这个函数,j时增加后的数。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-14 07:10 , Processed in 1.228322 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表