查看: 1423|回复: 8

【已解决】“CAN1_ReadFrame”函数接收多帧数据时如何分别保...

[复制链接]

该用户从未签到

7

主题

19

帖子

0

注册会员

Rank: 2

积分
176
最后登录
2020-4-11
发表于 2019-5-25 14:21:50 | 显示全部楼层 |阅读模式
本帖最后由 hjx1016 于 2019-6-22 14:44 编辑

can通信每帧数据最多为8字节,大于8字节时需要多帧传输,如果上位机发送一个多帧命令,中断接收时如何把每帧的数据分别提取出来并保存?我用的“CAN1_ReadFrame“函数,目前问题是现最后一帧数据会覆盖前面的帧
回复

使用道具 举报

该用户从未签到

7

主题

19

帖子

0

注册会员

Rank: 2

积分
176
最后登录
2020-4-11
 楼主| 发表于 2019-5-25 14:22:14 | 显示全部楼层
byte CAN1_ReadFrame(dword *MessageID,byte *FrameType,byte *FrameFormat,byte *Length,byte *Data)
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    [LV.10]以坛为家III

    66

    主题

    4888

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6152
    最后登录
    2024-4-15
    发表于 2019-5-25 14:41:24 | 显示全部楼层
    hjx1016 发表于 2019-5-25 14:22
    byte CAN1_ReadFrame(dword *MessageID,byte *FrameType,byte *FrameFormat,byte *Length,byte *Data)

    加一个环形buffer
    开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 14:02
  • 签到天数: 1481 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92875
    最后登录
    2024-4-30
    发表于 2019-5-25 18:01:31 | 显示全部楼层
    分配一个较大的数组,然后根据读取到的数据做缓存。
    但是个人觉得这种方式在数据完整性上不可靠,如果有此要求,你可以考虑使用CAN-FD或者以太网
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    176
    最后登录
    2020-4-11
     楼主| 发表于 2019-5-27 20:26:37 | 显示全部楼层
    stm1024 发表于 2019-5-25 18:01
    分配一个较大的数组,然后根据读取到的数据做缓存。
    但是个人觉得这种方式在数据完整性上不可靠,如果有此 ...

    这是我写的代码,Data是8字节数组,D是24字节,上位机发三帧数据想保存在D中,但这样保存的结果是三个第三帧,把前面的一二帧都覆盖了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 14:02
  • 签到天数: 1481 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92875
    最后登录
    2024-4-30
    发表于 2019-5-27 20:47:27 | 显示全部楼层
    hjx1016 发表于 2019-5-27 20:26
    这是我写的代码,Data是8字节数组,D是24字节,上位机发三帧数据想保存在D中,但这样保存的结果是三个第 ...

    例如你的如果是三个ID,例如0x18f001d1,0x18f002d1,0x18f003d1,你根据ID中的顺序,填充对应数据中固定的位置
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    176
    最后登录
    2020-4-11
     楼主| 发表于 2019-5-27 21:06:25 | 显示全部楼层
    stm1024 发表于 2019-5-27 20:47
    例如你的如果是三个ID,例如0x18f001d1,0x18f002d1,0x18f003d1,你根据ID中的顺序,填充对应数据中固定的 ...

    for(i=0;i<3;i++)
      {
       
        (void)CAN1_ReadFrame(MessageID,Frametype,Frameformat,Length,Data);
        for(j=0;j<8;j++)
        {
          D[j+8*i]=Data[j];
        }
      }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    176
    最后登录
    2020-4-11
     楼主| 发表于 2019-5-27 21:08:29 | 显示全部楼层
    stm1024 发表于 2019-5-27 20:47
    例如你的如果是三个ID,例如0x18f001d1,0x18f002d1,0x18f003d1,你根据ID中的顺序,填充对应数据中固定的 ...

    函数里面参数是输出量不是输入量,应该是你上位机发什么他就保存什么
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 14:02
  • 签到天数: 1481 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92875
    最后登录
    2024-4-30
    发表于 2019-5-28 11:35:58 | 显示全部楼层

    i应该是全局变量吧,不然你每次都是从0开始,把同一个报文的8个字节写三次
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-2 04:30 , Processed in 0.138255 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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