未来索引
开启左侧

CAN总线通信演示 (TinyGUI触屏)

  [复制链接]
邢远 发表于 2013-5-2 08:07:17 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
CAN是Controller AreaNetwork 的缩写,ISO国际标准化的串行通信协议。最早应用在汽车上,在欧洲是汽车网络的标准协议,目前已经广泛应用在工业自动化、智能家居、船舶、纺织和医疗设备等领域(详情请参见百度百科《CAN总线协议》)。
由于CAN总线接口.NET MicroFramework官方库并不支持,所以我在串口类库的基础上,根据CAN总线的特点,设计出一套CAN总线通信库。
CAN类库的声明如下:
public class CAN
    {
        publicCAN(string canName, CanBaudRatebaudRate);
        publicCAN(string canName, CanBaudRatebaudRate, CanConfig config);
        public int DatasToRead { get;}
        public int DatasToWrite { get;}
        public event CanEventHandlerDataReceived;
        public event CanEventHandlerErrorReceived;
        public int Close();
        public int DiscardInBuffer();
        public int DiscardOutBuffer();
        public int Flush();
        public int IOControl(CanIOControlcode, int parameter);
        public int Open();
        public int Read(CanDatadata);
        public int SetFilter(intindex, CanFilter filter);
        public int Write(CanDatadata);
    }
同时支持CAN2.0A和CAN2.0B协议,相对比较有特色的,一是CanData,二是过滤器设置。
一条CanData包含如下信息:
    public class CanData
    {
        publicCanData();
        publicCanData(uint id, boolIsEXID);
        publicCanData(uint id, boolIsEXID, 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
    {
        publicCanFilter(bool enable);
        publicCanFilter(uint id, uintmask);
        publicCanFilter(uint id0, uintid1, bool IsRemote);
        publicCanFilter(uint id, uintmask, bool IsRemote, boolIsMaskMode);
        publicCanFilter(ushort id0, ushortmask0, ushort id1, ushortmask1);
        publicCanFilter(bool IsMaskMode, bool IsFifo0, boolIsWidth32, uint data1, uintdata2);
        publicCanFilter(ushort id0, ushortid1, ushort id2, ushortid3, bool IsRemote);
        publicCanFilter(ushort id0, ushortmask0, ushort id1, ushortmask1, bool IsRemote, boolIsMaskMode);
    }
对STM32芯片集成的CAN功能来说,过滤器有两种过滤模式,一种是ID列表模式,另外一种是ID掩码模式。而这两种又根据过滤数据的宽度不同,分为32位和16位。
限于篇幅,关于CAN通信库具体的内容就不在此展开介绍了,详情请参见YFSoft.CAN.rar压缩包里面的文档说明。
本文借助三个物联网智能网关进行CAN总线网络通信,来讲解CAN总线的使用情况(顺便介绍一下TinyGUI的触摸屏事件使用)。
1345170284_6877.jpg
示例程序分两种:一种是主控程序,上面设计了三个开关按钮,并且可以切换需要控制的CAN设备。另外一种,就是从设备程序了,该程序部署分别部署到两个设备上,程序的唯一区别就是,所要接收的ID标识号不同,一个是2#,一个是3#(程序界面如上图所示)。
在说CAN总线通信之前,先介绍一下TinyGUI的触摸屏事件的使用。
示例代码如下,用法非常简单。
Graphics screen = new Graphics();
screen.OnTouch += newTouchEventHandler(screen_OnTouch);
static voidscreen_OnTouch(int x, inty, int state)
{
  //x-x坐标 y – y坐标
  //state – 1 按下 0 抬起
}
² 主控CAN通信程序
    第一步:创建一个CAN通信类,并绑定接收和错误事件
  can = new CAN("CAN1", CanBaudRate.bps_100K);      
    can.ErrorReceived += newCanEventHandler(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 += newCanEventHandler(can_DataReceived);
    can.ErrorReceived += newCanEventHandler(can_ErrorReceived);
can.SetFilter(0, newCanFilter(2,0,false));
过滤器设定的ID标识符为2或3.
第二步:数据接收
    static void can_DataReceived(intcanPort, int parameter)
    {
        intcount = can.DatasToRead;
        CanDatadata = new CanData();
        for (int i = 0; i < count; i++)
        {
            can.Read(data);
            intindex = data.Data[0];
            LameState[index] =!LameState[index];
            lamp[index].OnDraw(index,LameState[index]);
        }         
    }

该会员没有填写今日想说内容.

精彩评论3

南京-ABB 发表于 2013-5-10 14:09:34 | 显示全部楼层
有点复杂哈
智能技术共享平台 - 未来论 http://www.mywll.com/
回复

使用道具 举报

小刀 发表于 2014-6-11 16:21:25 | 显示全部楼层
看不懂的话,努力看是不是就能看懂啦
智能技术共享平台 - 未来论 http://www.mywll.com/
回复

使用道具 举报

SNKTG 发表于 2014-9-22 23:25:59 | 显示全部楼层
学习中,谢谢
智能技术共享平台 - 未来论 http://www.mywll.com/
回复

使用道具 举报

高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注2973

粉丝3237

帖子9934

发布主题
推荐阅读 更多
阅读排行 更多
广告位
!jz_fbzt! !jz_sgzt! !jz_xgzt! 快速回复 !jz_sctz! !jz_fhlb! 搜索

智能技术共享平台 - 未来论

关注服务号

进入小程序

全国服务中心:

运维中心:天津

未来之家:天津 青岛 济南 郑州 石家庄

                商务邮箱:xy@mywll.com

Copyright © 2012-2021 未来派 未来论 (津ICP备16000236号-5)