【物联网智能网关-09】CAN总线通信演示(TinyGUI触屏)

简介:

 CAN 是Controller Area Network 的缩写,ISO国际标准化的串行通信协议。最早应用在汽车上,在欧洲是汽车网络的标准协议,目前已经广泛应用在工业自动化、智能家居、船舶、纺织和医疗设备等领域(详情请参见百度百科《CAN总线协议》)。

由于CAN总线接口.NET Micro Framework官方库并不支持,所以我在串口类库的基础上,根据CAN总线的特点,设计出一套CAN总线通信库。

CAN类库的声明如下:

public class CAN      {          public CAN(string canName, CanBaudRate baudRate);          public CAN(string canName, CanBaudRate baudRate, CanConfig config);          public int DatasToRead { get; }          public int DatasToWrite { get; }          public event CanEventHandler DataReceived;          public event CanEventHandler ErrorReceived;          public int Close();          public int DiscardInBuffer();          public int DiscardOutBuffer();          public int Flush();          public int IOControl(CanIOControl code, int parameter);          public int Open();          public int Read(CanData data);          public int SetFilter(int index, CanFilter filter);          public int Write(CanData data);      }

同时支持CAN2.0A和CAN2.0B协议,相对比较有特色的,一是CanData,二是过滤器设置。

一条CanData包含如下信息:

 

   public class CanData      {          public CanData();          public CanData(uint id, bool IsEXID);          public CanData(uint id, bool IsEXID, byte[] data);          public int Count { get; }          public byte[] Data { get; }          public int Filter { get; }          public uint ID { get; }          public bool IsEXID { get; }          public bool IsRemote { get; }      }

和串口及网口通信不同,CAN一帧数据,最多能发8个字节的数据,ID可以是11位的标准ID也可以是29位的扩展ID,帧数据也可以定义为远程帧(不含数据,仅含ID等信息)或标准帧。STM32F207(或STM32F103),发送缓冲区可缓存3个数据帧r,接收缓冲区是双fifo,一个fifo可以接收3个数据包。但是仅仅这些还不够,本类库仿照串口通信,内置了可以任意定义发送和接收缓冲区大小的功能(其实对串口通信来说,发送和接收buffer却是内部定死的,用户不能自定义)。这样用户在大量发送和接收数据的时候,就无后顾之忧了。

过滤器(Filter)应该是CAN的精华所在了,要想理解和设置好,却不是易事。所以为了便于用户使用,对过滤器类重载了很多定义函数,过滤器类库声明如下:

 

   public class CanFilter      {          public CanFilter(bool enable);          public CanFilter(uint id, uint mask);          public CanFilter(uint id0, uint id1, bool IsRemote);          public CanFilter(uint id, uint mask, bool IsRemote, bool IsMaskMode);          public CanFilter(ushort id0, ushort mask0, ushort id1, ushort mask1);          public CanFilter(bool IsMaskMode, bool IsFifo0, bool IsWidth32, uint data1, uint data2);          public CanFilter(ushort id0, ushort id1, ushort id2, ushort id3, bool IsRemote);          public CanFilter(ushort id0, ushort mask0, ushort id1, ushort mask1, bool IsRemote, bool IsMaskMode);      }

对STM32芯片集成的CAN功能来说,过滤器有两种过滤模式,一种是ID列表模式,另外一种是ID掩码模式。而这两种又根据过滤数据的宽度不同,分为32位和16位。

限于篇幅,关于CAN通信库具体的内容就不在此展开介绍了,详情请参见YFSoft.CAN.rar压缩包里面的文档说明。

本文借助三个物联网智能网关进行CAN总线网络通信,来讲解CAN总线的使用情况(顺便介绍一下TinyGUI的触摸屏事件使用)。 

示例程序分两种:一种是主控程序,上面设计了三个开关按钮,并且可以切换需要控制的CAN设备。另外一种,就是从设备程序了,该程序部署分别部署到两个设备上,程序的唯一区别就是,所要接收的ID标识号不同,一个是2#,一个是3#(程序界面如上图所示)。

在说CAN总线通信之前,先介绍一下TinyGUI的触摸屏事件的使用。

示例代码如下,用法非常简单。

?
Graphics screen = new  Graphics();
 
screen.OnTouch += new  TouchEventHandler(screen_OnTouch);
 
static  void  screen_OnTouch( int  x, int  y, int  state)
 
{
 
   //x-x坐标 y – y坐标
 
   //state – 1 按下 0 抬起
 
}

  

² 主控CAN通信程序

    第一步:创建一个CAN通信类,并绑定接收和错误事件

  can = new CAN("CAN1", CanBaudRate.bps_100K);      

    can.ErrorReceived += new CanEventHandler(can_ErrorReceived);

第二步:根据选项不同,发送不同ID标识符和不同的CAN数据

can.Write(new CanData(canID, true, new byte[] { 0, 0 }));

canID 是2或者3,数据的第一个数,0~2 表示对应的3个灯。

² 从设备CAN通信程序

第一步:创建一个CAN通信类,并绑定接收和错误事件

  can = new CAN("CAN1", CanBaudRate.bps_100K);      

    can.DataReceived += new CanEventHandler(can_DataReceived);

    can.ErrorReceived += new CanEventHandler(can_ErrorReceived);

can.SetFilter(0, new CanFilter(2,0,false));

过滤器设定的ID标识符为2或3.

第二步:数据接收

 


 
 
  1. static void can_DataReceived(int canPort, int parameter) 
  2.   
  3.   
  4.     int count = can.DatasToRead; 
  5.   
  6.     CanData data = new CanData(); 
  7.   
  8.     for (int i = 0; i < count; i++) 
  9.   
  10.     { 
  11.   
  12.         can.Read(data); 
  13.   
  14.         int index = data.Data[0]; 
  15.   
  16.         LameState[index] = !LameState[index]; 
  17.   
  18.         lamp[index].OnDraw(index, LameState[index]); 
  19.   
  20.     }           
  21.   
  22.    

² TinyGUI界面设计

略,详情请参见示例代码。 

程序部署后,时间运行的视频如下:

 

http://v.youku.com/v_show/id_XNDM5NzI1MTg0.html

注意:为了正常运行本实例,物联网智能网关固件版本需要升级到V1.8.17以上,(如果你当前TinyCLR版本低于V1.7.15以下,TinyBooter也需要同步升级)。

固件下载地址:http://www.sky-walker.com.cn/MFRelease/firmware/MFv42_YF_Wisteria207.rar

---------------------------------   

类库下载:http://www.sky-walker.com.cn/MFRelease/library/V42//YFSoft.CAN.rar

示例下载:http://www.sky-walker.com.cn/MFRelease/Sample/CAN_Test.rar

MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770

MF资料:http://www.sky-walker.com.cn/News.asp?Id=25








本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/966558,如需转载请自行联系原作者

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
数据采集 Python
在Python中进行数据清洗和预处理缺失值处理缺失数据剔除
在Python中进行数据清洗和预处理缺失值处理缺失数据剔除
487 4
|
机器学习/深度学习 移动开发 数据挖掘
Python是一种广泛使用的高级编程语言,具有许多优点和缺点
Python是一种广泛使用的高级编程语言,具有许多优点和缺点
618 1
|
Windows
wmiprvse.exe是什么进程?
wmiprvse.exe cpu占用资源很高怎么禁用?
1339 5
|
监控 安全 Java
Java Z 垃圾收集器如何彻底改变内存管理
大家好,我是V哥。今天聊聊Java的ZGC(Z Garbage Collector)。ZGC是一个低延迟垃圾收集器,专为大内存应用场景设计。其核心优势包括:极低的暂停时间(通常低于10毫秒)、支持TB级内存、使用着色指针实现高效对象管理、并发压缩和去碎片化、不分代的内存管理。适用于实时数据分析、高性能服务器和在线交易系统等场景,能显著提升应用的性能和稳定性。如何启用?只需在JVM启动参数中加入`-XX:+UseZGC`即可。
280 0
|
人工智能 自然语言处理 程序员
提交通义灵码创新实践文章,重磅好礼只等你来!
通义灵码创新实践征集赛正式开启,发布征文有机会获得重磅好礼+流量福利,快来参加吧!
23442 21
|
JSON JavaScript 中间件
POST 请求如何处理表单数据?
【10月更文挑战第24天】POST请求处理表单数据需要客户端和服务器端的协同工作,客户端负责将表单数据正确地编码并发送给服务器,服务器端则需要准确地接收、验证和处理数据,并向客户端返回合适的响应。
557 1
|
存储 小程序 前端开发
毕业设计:微信小程序健康管理系统的开发与实现
经过调查和走访研发的这套在线健康管理系统,采用微信小程序云开发实现,基于Mongodb数据库进行数据存储,前端使用微信小程序开发实现,后端基于Nodejs开发实现。系统前端用户主要实现查看新闻通知、体检知识、在线体检预约、查看我的预约、修改个人资料等。后台主要实现用户管理、内容管理、活动和预约管理、统计预约用户数等功能。这套系统的上线对于人们健康的管理和体检预约都有很大帮助。...
3910 3
毕业设计:微信小程序健康管理系统的开发与实现
|
机器学习/深度学习 存储 算法
python实现基于长短期记忆网络LSTM模型预测茅台股票价格趋势
python实现基于长短期记忆网络LSTM模型预测茅台股票价格趋势
774 0
|
监控 关系型数据库 Linux
|
Web App开发 编解码 安全
零基础快速入门WebRTC:基本概念、关键技术、与WebSocket的区别等
本文主要分享了WebRTC的基本概念、关键技术术语(包括NAT、STUN、TURN、ICE、SDP 和信令),着重讲解了WebRTC是如何实现P2P通信以及WebRTC信令的作用,同时讨论了WebRTC在技术上的优势和劣势,最后还提供了一个简单的WebRTC Demo代码。
1611 0
零基础快速入门WebRTC:基本概念、关键技术、与WebSocket的区别等

相关产品

  • 物联网平台