概述
前阵子在工作中用到了CAN通讯的功能,之前我一直没有接触过CAN通讯。虽说是有机会能够接触到,但是不管是代码还是其他的什么资料信息我都没有尝试看过。直到工作中遇到后才让我有机会稍微认识一下这个“老大难”的技术。
个人觉得CAN通讯最基础的收发功能能够会用了,其他的倒也不是什么太大的挑战,万事开头难。今天撇开芯片,撇开底层的代码直接来看一下CAN消息帧的收发。这部分的实现直接写C代码当然是可以完成的,但是从直观性以及可维护性来说的话还是要差一些。我觉得MATLAB以及simulink以及其他的一些部分MATLAB的组件是汽车电子行业的福音,如果想简单高效而又可靠地完成开发工作,MATLAB以及用得到的工具箱还是值得买一下的。使用这种模型化的工具开发绝对是工作质量与效率上提升的双重收获。
CAN消息帧的发送:
完成这个功能用到的是canpack模块,在消息的输入上有几种方式:元数据、手动指定、使用dbc文件。个人觉得这三种方式依次越来越简单,当然,这跟个人习惯有关。说到dbc文件,可能还需要专门的软件工具还进行编辑。接下来演示一下如何把几个变量通过CAN消息帧发送出去,应该还没有发出去,只是把这些相应的变量映射到消息帧上。在MATLAB的帮助文件中采用了小端的方式,这里我采用大端。实际的工作中,我觉得大端的数据在很多CAN通讯的解析工具中看着更加符合我们的实际的思维排列方式。不过,在canpack模块中进行信号的安排时小端的数据格式则更加符合我们的思维方式。
我接下来把2个8bit,一个16bit,一个32bit的变量放到同一个消息帧中,这样刚好用完一个消息帧的所有空间。不过,消息帧的数据场使用是比较灵活的,用多少位都是可以自己去控制的,倒不是说一定要用满。放入消息帧的变量也不一定必须是8bit的整数倍,也可以是其他的长度。不过在模型搭建的时候,输入的变量肯定是要按照8bit来对其。比如一个12bit的信息,模型中输入端口的变量可以定义为16bit。
以下是我定义的数据,定义完之后发现全是无符号的数,其实有符号的或者是带精度以及偏移量的都是可以控制的,把相应的信息填写上即可。其中,Identifier是CAN
ID。
添加输入输出接口以及变量的数据定义,用之前我在博客中介绍的简单的小脚本(相关介绍文后附加链接)处理一下模型如下:
需要注意的是输出端口的名字在代码生成的时候会是消息帧的名字,而涉及到多个层次多个子系统的,消息帧的名字会是最外面一层输出端口的名字。
用脚本处理后模型已经可以直接生成代码,查看代码生成报告如下:
值得注意的是在代码的注释中会看到以下类似信息:
这里面对每个加入到消息帧的变量在消息帧中的相应信息都有一个很好的说明,如果测试中发现发送的消息传递不准确需要查找问题的时候,这是一个很好的追踪条件。
最后,距离这个CAN消息帧的发出只剩一步了:把消息帧加入到CAN发送的函数接口,同时在任务调度中增加这部分模型代码的调用。
CAN消息帧的解析:
这是对上面工作的一个逆向,也有相应的模块canunpack来实现这个功能。需要注意的是CAN的发送在代码实现上通常来说识别的是消息帧的名字,而CAN的接收识别的是CAN
ID。至于为什么,看一下模型的代码结构也自然就清楚了,暂不多述。
接下来实现一个CAN
ID为0的消息帧的接收,假设就是上面的这个消息帧(上面的消息帧的ID为0),解析成四个变量。
数据定义如下:
模型如下:
代码生成OK!至于功能的执行,则需要底层CAN接口的修改以及任务调度的完善。
附加之前模型配置小脚本的链接:http://blog.sina.com.cn/s/blog_627927570102w5aa.html
最后
以上就是时尚灰狼为你收集整理的matlab编辑can,[转载]MATLAB simulink CAN消息帧收发与代码生成的实现的全部内容,希望文章能够帮你解决matlab编辑can,[转载]MATLAB simulink CAN消息帧收发与代码生成的实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复