硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4190|回复: 5
收起左侧

[有问必答] STM32中 CAN接收中断里为什么每次接收到的第一次数据都是空的?

[复制链接]

27

主题

94

回帖

175

积分

初级会员

积分
175
发表于 2020-12-26 10:34:27 | 显示全部楼层 |阅读模式
本帖最后由 Mark 于 2020-12-26 11:00 编辑
  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.                         
  12.         
  13.                                   CAN_ClearITPendingBit(CAN2,CAN_IT_FMP0);
  14.                                         CAN_Receive(CAN2, 0, &RxMessage);
  15.                                        
  16.                                  if(RxMessage.Data[1]==0x01)
  17.                                  {
  18.                                                          sun2= RxMessage.Data[2] ;                          
  19.                                  }
  20.                                                 
  21.                                        
  22.                                         //接收can的原始数据
  23.                                         for(i=0;i<8;i++)
  24.                                         {
  25.                                                         buf2[j] =RxMessage.Data[i];                                                        
  26.                                                 //        printf("rxbuf2[%d]:%0x\r\n",j,        buf2[j]);                                                                                                        
  27.                                                         j++;                                                
  28.                                         }

  29.                                   //重新组包数据        
  30.                                         if(j>7)
  31.                                         {
  32.                                                  memTomem(temp2+k,buf2+j,8);
  33.                                                 
  34.                                                         for(i=0;temp2[k]!=0&&i<8;i++)
  35.                                                         {                                
  36.                                                                 printf("rxbuf3[%d]:%0x\r\n",k,        temp2[k]);     //开发板断电在上电,这里每次第一次打印temp2时都是空,就是什么都不输出,是什么原因呢?
  37.                                                                 k++;
  38.                                                                 count2++;
  39.                                                         }                                
  40.                                                                                        
  41.                                         }
  42.                                        
  43.                                                   if(sun2==0)//是否接收完当前报文帧数
  44.                                                 {                                                                                                               

  45.                                                                         j=0;//将数组下标还原为0
  46.                                                                         k=0;        
  47.                                                                         count2=0;                                                                        
  48.                                                 }                                                   
  49.                                         sun2--;                                                                                                
  50. //问题在37行,请大佬们帮忙看下,是不是我哪里写的不对?
  51. }
复制代码


回复

使用道具 举报

27

主题

94

回帖

175

积分

初级会员

积分
175
 楼主| 发表于 2020-12-26 10:37:28
问题在37行,请大佬们帮忙看下是不是我写的有问题?

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2020-12-26 10:43:52 | 显示全部楼层
没遇到过。
回复

使用道具 举报

27

主题

94

回帖

175

积分

初级会员

积分
175
 楼主| 发表于 2020-12-26 10:59:34
问题在37行,请大佬们帮忙看下,是不是我哪里写的不对?

27

主题

94

回帖

175

积分

初级会员

积分
175
 楼主| 发表于 2020-12-26 10:59:43 | 显示全部楼层
问题在37行,请大佬们帮忙看下,是不是我哪里写的不对?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2020-12-26 16:41:19 | 显示全部楼层
Mark 发表于 2020-12-26 10:59
问题在37行,请大佬们帮忙看下,是不是我哪里写的不对?

别在中断里面整串口打印。

直接调试状态全速运行,此处来个断点,看rxbuf3缓冲值
回复

使用道具 举报

27

主题

94

回帖

175

积分

初级会员

积分
175
 楼主| 发表于 2020-12-28 08:59:10 | 显示全部楼层
eric2013 发表于 2020-12-26 16:41
别在中断里面整串口打印。

直接调试状态全速运行,此处来个断点,看rxbuf3缓冲值

硬汉哥,把中断里面的串口屏蔽掉了,还真的行了,难道是因为CAN数据传输太快,而串口打印太慢了吗?那为什么只是第一次数据没有反应呢?还后面的数据源都可以正常打印出来呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2020-12-29 09:15:17 | 显示全部楼层
Mark 发表于 2020-12-28 08:59
硬汉哥,把中断里面的串口屏蔽掉了,还真的行了,难道是因为CAN数据传输太快,而串口打印太慢了吗?那为 ...

本身中断里面就不适合做串口打印,做SEGGER RTT打印是可以的,速度非常快。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 00:21 , Processed in 0.236379 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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