培训、咨询、项目开发,请与【思想】联系

1.结构体

通过前面文章《》的介绍,对于CAN通讯协议有三个非常重要的信息,分别是报文ID、数据场、解析与偏移。实现通讯协议的第一步就是定义一个报文的结构体。

⚪ 定义报文ID

本次使用的例子是基于扩展ID,ID长度为29个位。由于C语言没有29位长度的数据类型所以使用32位数据类型UINT32。如果是标准ID使用16位数据类型UINT16即可。

小提示:数据类型

标准的C语言是没有UINT32、UINT16等这样的变量,这都是根据选用芯片的类型在宏中预先定义的。如:16位系统的UINT32 对应的C语言表达就是unsigned long,而对于32位系统的UINT32则对应的是usigned int。

⚪ 定义数据场

使用UINT8数据类型定义一个八字节的数组,用来存放数据场信息

⚪ 定义解析与偏移结构体

需要另外在定义一个结构体,用来存放偏移与解析值。如上图,包含两个Float型数据。

在我们的报文结构体中对每一个信号的解析信息进行实例化。上图中的红色部分只用来说明如何调用【解析与偏移】结构体,后面会导入我们真正的例子信息。

2.矩阵

CAN数据帧包含64位的数据场,矩阵就是用来定义数据场如何划分的。这部分在通讯协议中体现在每个信号的起始位置与数据长度。

这是【思想】使用Vetor CANdb++做的矩阵例子,以下称为【一号例子】。这个例子包含了一个16位数据、两个8位数据、一个32位数据,总共64位长度。数据位都对齐,不存在空位,十分完美。但是实际应用就不是这么美丽的了。

上图是【思想】定义的另一个矩阵,以下称为【二号例子】。这个矩阵就比较奇葩,一个12位数据、一个21位数据、一个3位数据、一个2位数据,并且数据与数据之间还存在着空位,整个数据场还剩下后面24位没利用到。

3.共同体

共同体这个知识点在C语言中比较冷门,【思想】在接触CAN协议栈之前也不是很清楚共同体用来干嘛的。所以就先介绍下这个知识点。

所谓共用体,它表示的是几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在共用体中,所有的成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。当一个共用体被声明时,编译程序自动地产生一个变量,其长度(以字节byte为单位,一个byte是8个二进制位)为联合中最长的数据类型长度的整数倍。

回到我们的CAN报文的数据场,由8个1字节的内存空间组成。每一个报文根据自身的矩阵信息对这个区域重新划分。

该段代码是【一号例子】,使用共同体描述矩阵信息。定义的共同体既可以通过字节数组(Bytes)数据进行读写,也可以根据位定义位结构体(Bits)的数据变量进行读写。在【解析与偏移】中也对结构体进行实例化,待后序初始化中进行赋值。

【二号例子】由于数据位没有对齐并且存在空位,所以处理起来就稍微麻烦点。首先要处理数据长度不是常见的8、16、32,例如第一个数据是一个12位的数据,这里就使用【UINT16  Bit12:12;】先定义一个UINT16的数据,在通过【:12】定义有效数据长度只有12位。然后就是要处理空位的部分,正如上面矩阵中显示。第12、36、37为空位,就根据空位的长度定义一个UINT8的数据类型将空位补上。本例中的【UINT8  EMPTY_1:2;】。这里注意要优先保证数据位对齐,主要为了大小端字节序的自动化处理,这是一个很恶心的事情,以后会有专门的内容介绍。

补充空位后的数据块位长度一定要为8的倍数,实现上图的对齐效果。其实共同体这个方法,适用于大部分的通讯协议,比如TCPIP、485、RS232等。

4.初始化

以上就已经介绍了如何在结构体中定义通讯协议,真正开始使用前还需要对结构体实例化,并对数据初始化。

根据前面创建的结构体名称,实例化为变量

初始化数据部分从上到下顺序分别为:

对报文ID进行赋值,这里的ID在前面通过使用宏定义;

将64位的数据场全部填0;

对解析偏移结构体的参数进行赋值,填充位是不需要定义解析偏移参数的;

5.接收解析与发送编码

这次【思想】挑选的两个例子,正好一个是发送、一个是接收,就能够很好的来说明解析与编码。

对于发送报文就需要经过编码处理,红色框为ASW->BSW的接口变量,将接口变量与解析偏移结构体中的解析值与偏移运算。得到需要发送报文结构体中共同体下的发送数据。该运算与上面的解析运算为逆运算。

6.尾声

到目前为止,【思想】介绍了如何在C语言中实现CAN总线的报文结构,及其初始化、解析、编码等数据操作。由于篇幅限制,飞思卡尔与Intel的字节序问题及接口自动生成技术,将放到后续的文章中来讨论。

CAN通讯程序C语言,嵌入式C语言环境下的CAN总线通讯协议相关推荐

  1. 二级c语言编译完程序如何运行,计算机二级C语言辅导:C++环境下编译和运行c语言...

    一 单个文件运行 1 打开vc++出现如图 2 从file菜单中选择"new"→c++source file如图 3 单击"--"命令按扭,在choose di ...

  2. 威纶tk6070ik与台达变频器vdf-s485通讯程序 自己编写的威纶触摸屏与台达变频器的通讯

    威纶tk6070ik与台达变频器vdf-s485通讯程序 自己编写的威纶触摸屏与台达变频器的通讯程序,可以直接控制变频器正反转,启动停止,监视变频器的电流电压等及错误代码等. ID:981558944 ...

  3. 信捷XC PLC与3台施耐德ATV12变频器通讯程序 信捷XC PLC与3台施耐德ATV12变频器通讯

    信捷XC PLC与3台施耐德ATV12变频器通讯程序 信捷XC PLC与3台施耐德ATV12变频器通讯,可靠稳定,同时解决施耐德ATV12变频器断电重启后,自准备工作,无需人为准备. 器件:信捷XC3 ...

  4. c语言bnd文件,Unix环境下嵌入式C程序编译

    A.预编译部分 1.预编译DB2篇 1.1 什么是DB2预编译 在我们用C语言编写访问DB2的程序过程中,需要用到嵌入式SQL,其作用是将DB2 SQL混入一般C程序中, DB2预编译器可以将SQL语 ...

  5. linux环境c语言课程设计,linux环境下c语言编程课程设计

    linux环境下c语言编程课程设计 (14页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 1/14LINUX操作系统教程课程设计题目算术 ...

  6. 【c语言 gcc9.1.0环境下编译报错】error: ‘true’ undeclared (first use in this function)

    问题 网上验证一个单链表是否有环的c语言demo,放到gcc9.1.0的环境下编译,发现编译报错: error: 'true' undeclared (first use in this functi ...

  7. 南工程c语言实验报告,Linux环境下-C语言编程实验报告(1)(总4页).doc

    Linux环境下-C语言编程实验报告(1)(总4页).doc 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称 Linux环境下 C语言编程 专业名称 网络工程班 级 1203班 学生姓名 ...

  8. 一文实现:在python中调用matlab程序,保姆级安装windows环境下的matlab.engine教程

    一.前言   我最近在做一个基于图像融合的目标检测工程,我经常用matlab去研究和创新新型的图像融合算法,因为matlab有着python所不可比拟的数据可视化功能和大量的滤波分解框架包:在目标检测 ...

  9. 痞子衡嵌入式:IAR环境下无法直接下载调试i.MXRT分散链接工程的解决方案(宏文件.mac+双Flashloader)...

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR环境下无法直接下载调试i.MXRT分散链接工程的解决方案. 分散链接与加载一直是嵌入式领域比较劝退新手的难题,在恩智浦 i.MXR ...

最新文章

  1. Flutter开发之ListView添加HeaderView和FooterView-2(39)
  2. Python学习笔记010——作用域
  3. 信息系统项目管理师优秀论文:项目风险管理
  4. Linux入门笔记——cal、date、free、clear、history、man、whatis、uname
  5. 初学者python笔记(字符串用法解析)
  6. 分库分表 or 中间件 ?
  7. [SCOI2016]萌萌哒
  8. MFC | 基于文档存储的学生成绩信息管理系统
  9. 微信小程序如何上传图片
  10. 世界各国发展指标(1960-2019)
  11. 烟台移动dns网关_如何设置移动宽带DNS和IP地址
  12. 三种查询IP归属地的接口
  13. 32位/64位处理器:*char与*int的区别?不同类型的指针+1的区别?
  14. 对腾讯云qcloud音视频通信SDK的调研(优缺点)
  15. Spring Boot配置MongoDB多数据源
  16. STM32F103最小系统原理图
  17. 三菱PLC模板程序FX5U轴FB块 使用ST语言编写的轴FB块,包含原点复归,点动,定位运动
  18. Spring配置文件报错 :通配符的匹配很全面, 但无法找到元素 ‘context:property-placeholder‘ 的声明
  19. pip install av 无法安装
  20. 看人脸技术如何识别真假美猴王

热门文章

  1. 【黑苹果】宏基Acer Swift 3(SF315-51-518S)+i5-8250U+macos 10.15 efi文件下载!
  2. java中 像素、英寸、厘米的换算
  3. VC++ 六种 Runtime Library
  4. linux c语言 utf8转gbk,GBK(gb2312)和UTF-8互转(转载)
  5. GO 语言基础语法一 (快速入门 Go 语言)
  6. 国内三大运营商的WLAN上网,你了解多少?
  7. java建站_Java建站流程 ---------- 1.Eclipse 与 Maven
  8. JAVA JDK1.8 API 中文文档 高清完整版 CHM.rar(永久有效)
  9. jQuery实现的各种不同样式弹出框
  10. ST-LINK/V2 + STM8 + STVP 下载程序+Error on Option Bytes