8948|6

259

帖子

5

TA的资源

一粒金砂(高级)

楼主
 

CAN通讯的数据格式该如何定义?以什么标准定义? [复制链接]

本帖最后由 Tobey 于 2016-10-2 16:34 编辑

    最近需要实现上位机与下位机的CAN通讯,现在双方苦于不知该如何定义数据格式,尤其是传输浮点数据~~
起初经过讨论直接根据个人主观意愿定义了双方的数据协议,,,其后,boss要求采用标准进行定义,,,无标准则视本程序无效!于是乎,查阅了IEEE 754标准,其浮点数标准格式分为三个部分:数符,
阶码(含阶符),尾数;考虑到程序中所需传输的数据并不大,因此决定使用短实数:符号位S(1位),
阶码(8位),尾数(23位),总位数(32位);   

   CAN的数据域为64位,8个字节,按8位进行划分,分为data[0]…data[7],若按上述分析,则各对应关系应为:
符号位S --》data[0],阶码--》data[1],尾数--》data[2],data[3],data[4],即总共占用了5个字节。  

   显然,采用上述标准浪费了8位~~  

   实际系统所需传输的浮点数范围为0~400,因此,实际传输数据为无符号浮点数,两个字节可表示的无符号
整型范围为0~65535,那么,大可以将获取到的浮点数乘以100,即范围扩大为0~40000,此时并没有超过
两个字节所能表示的范围,即:可以仅使用两个字节完成浮点数的传输,

  那么,问题来了,是否有相关的标准可以参照呢?无标准则无话语权,项目数据传输这块将无法进行~~  

  有做过CAN的各位前辈提供几个标准给小弟参考参考吧!  



此帖出自stm32/stm8论坛

最新回复

这个我记得周立功有个can的总线协议,建议你搜索看。他那个好像写的比较多。。。。。  详情 回复 发表于 2016-10-12 12:23
点赞 关注
 

回复
举报

39

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
本帖最后由 phope2000 于 2016-10-4 21:35 编辑

float 4个字节,double 8个字节,float a; char buf[4]; memcpy (buf, &a, 4);
此帖出自stm32/stm8论坛

点评

多谢!因为考虑到CAN数据帧每次都是传输8个字节,不用也是浪费,最后采用的是直接使用ASCCII码填充数据域部分,将前两个字节作为操作指令码,后六个字节全部用于传输数据,  详情 回复 发表于 2016-10-7 10:50
 
 

回复

4005

帖子

0

TA的资源

版主

板凳
 
本帖最后由 huo_hu 于 2016-10-6 01:55 编辑

a。你可能不需要那么高的精度,能省就省,你只需要和上位机约定好,“我给你的数是100或者1000倍放大以后的整数”就行了,所以浮点数是给可以商确的东西。
b。如果决定用浮点数也不需要那么麻烦,你只要告诉上位机浮点数的格式和高低字节的顺序,其它的就是上位机处理了。
c。can的标准贞是8个字节发送64位浮点是一点富余也没有了,这样想再加别的你就山穷水尽的地步了,再斟酌一下吧。

楼上的memcpy在交换高低字节顺序时是个主意。
此帖出自stm32/stm8论坛

点评

多谢指教!是的,因为我们所需要的浮点数范围仅在0-400,因此,我就把数据域中的后6个字节采用ASCCII码进行传输,整数部分占3个字节,小数点一个字节,小数部分占两个字节,加上操作码两个字节,这样正好8个字节全用  详情 回复 发表于 2016-10-7 10:54
 
 

回复

259

帖子

5

TA的资源

一粒金砂(高级)

4
 
phope2000 发表于 2016-10-4 21:34
float 4个字节,double 8个字节,float a; char buf[4]; memcpy (buf, &a, 4);

多谢!因为考虑到CAN数据帧每次都是传输8个字节,不用也是浪费,最后采用的是直接使用ASCCII码填充数据域部分,将前两个字节作为操作指令码,后六个字节全部用于传输数据,
  1. if (CAN_receive (1, &Msg_Rece, 0x00FF) == CAN_OK)  {
  2.       Rx_Msg.Cmd = (Msg_Rece.data[0]-0x30)*10 + (Msg_Rece.data[1]-0x30) ;
  3.       for( i=2; i<8; i++ )
  4.       {
  5.          str[i-2] = Msg_Rece.data[i]; // 获取数据域中除操作码外的所有数据
  6.       }
  7.       Rx_Msg.Data = atof(str);    // 将获取到的字符串类型数据转换为浮点型数据
复制代码
此帖出自stm32/stm8论坛
 
 
 

回复

259

帖子

5

TA的资源

一粒金砂(高级)

5
 
huo_hu 发表于 2016-10-6 01:54
a。你可能不需要那么高的精度,能省就省,你只需要和上位机约定好,“我给你的数是100或者1000倍放大以后的 ...

多谢指教!是的,因为我们所需要的浮点数范围仅在0-400,因此,我就把数据域中的后6个字节采用ASCCII码进行传输,整数部分占3个字节,小数点一个字节,小数部分占两个字节,加上操作码两个字节,这样正好8个字节全用上了,,,
此帖出自stm32/stm8论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

6
 
这个我记得周立功有个can的总线协议,建议你搜索看。他那个好像写的比较多。。。。。
此帖出自stm32/stm8论坛

点评

好的,谢谢!  详情 回复 发表于 2016-10-12 12:57
 
 
 

回复

259

帖子

5

TA的资源

一粒金砂(高级)

7
 
huaiqiao 发表于 2016-10-12 12:23
这个我记得周立功有个can的总线协议,建议你搜索看。他那个好像写的比较多。。。。。

好的,谢谢!
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表