打印
[应用相关]

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

[复制链接]
823|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 | 只看该作者
永恒的乱码?

使用特权

评论回复
5
磨砂| | 2021-2-2 23:51 | 只看该作者
中断函数要尽可能简单

使用特权

评论回复
6
晓伍| | 2021-2-2 23:53 | 只看该作者
硬件上需要可靠接地 要不然也容易出现这种现象

使用特权

评论回复
7
八层楼| | 2021-2-2 23:54 | 只看该作者
都快要泡在中断出不来了

使用特权

评论回复
8
powerantone| | 2021-2-8 16:12 | 只看该作者
memTomem(temp2+k,buf2+j,8);
这里写的是不是有问题?总是把buf2中最后的地址copy到temp2.
从代码上看比较乱,如果只是简单的数据入队,没必要这么麻烦,可以参考ring.c这种循环队列。
也可以直接用memcpy(temp2+k,RxMessage.Data,8);没必要在中间再倒一次手吧。

使用特权

评论回复
9
laocuo1142| | 2021-2-8 16:13 | 只看该作者
楼主,其他的我只是建议,终端中尽量少做这些处理,交由中断外处理。
memTomem(temp2+k,buf2+j,8);检查这个函数,j时增加后的数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1323

主题

3805

帖子

0

粉丝