天天看點

【物聯網智能網關-09】CAN總線通信示範(TinyGUI觸屏)

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的觸摸屏事件使用)。

【物聯網智能網關-09】CAN總線通信示範(TinyGUI觸屏)

示例程式分兩種:一種是主要程式,上面設計了三個開關按鈕,并且可以切換需要控制的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 = 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]);

        }          

    }           

TinyGUI界面設計

略,詳情請參見示例代碼。 

程式部署後,時間運作的視訊如下:

【物聯網智能網關-09】CAN總線通信示範(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