发表于:2012/11/8 0:19:23
#0楼
CAN 是Controller Area Network 的缩写,ISO国际标准化的串行通信协议。最早应用在汽车上,在欧洲是汽车网络的标准协议,目前已经广泛应用在工业自动化、智能家居、船舶、纺织和医疗设备等领域(详情请参见百度百科《CAN总线协议》)。
由于CAN总线接口.NET Micro Framework官方库并不支持,所以我在串口类库的基础上,根据CAN总线的特点,设计出一套CAN总线通信库。
CAN类库的声明如下:
[URL=][/URL]
publicclassCAN
{
publicCAN(stringcanName, CanBaudRate baudRate);
publicCAN(stringcanName, CanBaudRate baudRate, CanConfig config);
publicintDatasToRead {get; }
publicintDatasToWrite {get; }
publiceventCanEventHandler DataReceived;
publiceventCanEventHandler ErrorReceived;
publicintClose();
publicintDiscardInBuffer();
publicintDiscardOutBuffer();
publicintFlush();
publicintIOControl(CanIOControl code,intparameter);
publicintOpen();
publicintRead(CanData data);
publicintSetFilter(intindex, CanFilter filter);
publicintWrite(CanData data);
}
[URL=][/URL]
同时支持CAN2.0A和CAN2.0B协议,相对比较有特色的,一是CanData,二是过滤器设置。
一条CanData包含如下信息:
[URL=][/URL]
publicclassCanData
{
publicCanData();
publicCanData(uintid,boolIsEXID);
publicCanData(uintid,boolIsEXID,byte[] data);
publicintCount {get; }
publicbyte[] Data {get; }
publicintFilter {get; }
publicuintID {get; }
publicboolIsEXID {get; }
publicboolIsRemote {get; }
}
[URL=][/URL]
和串口及网口通信不同,CAN一帧数据,最多能发8个字节的数据,ID可以是11位的标准ID也可以是29位的扩展ID,帧数据也可以定义为远程帧(不含数据,仅含ID等信息)或标准帧。STM32F207(或STM32F103),发送缓冲区可缓存3个数据帧r,接收缓冲区是双fifo,一个fifo可以接收3个数据包。但是仅仅这些还不够,本类库仿照串口通信,内置了可以任意定义发送和接收缓冲区大小的功能(其实对串口通信来说,发送和接收buffer却是内部定死的,用户不能自定义)。这样用户在大量发送和接收数据的时候,就无后顾之忧了。
过滤器(Filter)应该是CAN的精华所在了,要想理解和设置好,却不是易事。所以为了便于用户使用,对过滤器类重载了很多定义函数,过滤器类库声明如下:
[URL=][/URL]
publicclassCanFilter
{
publicCanFilter(boolenable);
publicCanFilter(uintid,uintmask);
publicCanFilter(uintid0,uintid1,boolIsRemote);
publicCanFilter(uintid,uintmask,boolIsRemote,boolIsMaskMode);
publicCanFilter(ushortid0,ushortmask0,ushortid1,ushortmask1);
publicCanFilter(boolIsMaskMode,boolIsFifo0,boolIsWidth32,uintdata1,uintdata2);
publicCanFilter(ushortid0,ushortid1,ushortid2,ushortid3,boolIsRemote);
publicCanFilter(ushortid0,ushortmask0,ushortid1,ushortmask1,boolIsRemote,boolIsMaskMode);
}
[URL=][/URL]
对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 抬起
}
2 主控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个灯。
2 从设备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.
第二步:数据接收
?
static void can_DataReceived(int canPort,int parameter)
{
int count = can.DatasToRead;
CanData data =new CanData();
for (int i = 0; i < count; i++)
{
can.Read(data);
int index = data.Data[0];
LameState[index] = !LameState[index];
lamp[index].OnDraw(index, LameState[index]);
}
}
2 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
由于CAN总线接口.NET Micro Framework官方库并不支持,所以我在串口类库的基础上,根据CAN总线的特点,设计出一套CAN总线通信库。
CAN类库的声明如下:
[URL=][/URL]
publicclassCAN
{
publicCAN(stringcanName, CanBaudRate baudRate);
publicCAN(stringcanName, CanBaudRate baudRate, CanConfig config);
publicintDatasToRead {get; }
publicintDatasToWrite {get; }
publiceventCanEventHandler DataReceived;
publiceventCanEventHandler ErrorReceived;
publicintClose();
publicintDiscardInBuffer();
publicintDiscardOutBuffer();
publicintFlush();
publicintIOControl(CanIOControl code,intparameter);
publicintOpen();
publicintRead(CanData data);
publicintSetFilter(intindex, CanFilter filter);
publicintWrite(CanData data);
}
[URL=][/URL]
同时支持CAN2.0A和CAN2.0B协议,相对比较有特色的,一是CanData,二是过滤器设置。
一条CanData包含如下信息:
[URL=][/URL]
publicclassCanData
{
publicCanData();
publicCanData(uintid,boolIsEXID);
publicCanData(uintid,boolIsEXID,byte[] data);
publicintCount {get; }
publicbyte[] Data {get; }
publicintFilter {get; }
publicuintID {get; }
publicboolIsEXID {get; }
publicboolIsRemote {get; }
}
[URL=][/URL]
和串口及网口通信不同,CAN一帧数据,最多能发8个字节的数据,ID可以是11位的标准ID也可以是29位的扩展ID,帧数据也可以定义为远程帧(不含数据,仅含ID等信息)或标准帧。STM32F207(或STM32F103),发送缓冲区可缓存3个数据帧r,接收缓冲区是双fifo,一个fifo可以接收3个数据包。但是仅仅这些还不够,本类库仿照串口通信,内置了可以任意定义发送和接收缓冲区大小的功能(其实对串口通信来说,发送和接收buffer却是内部定死的,用户不能自定义)。这样用户在大量发送和接收数据的时候,就无后顾之忧了。
过滤器(Filter)应该是CAN的精华所在了,要想理解和设置好,却不是易事。所以为了便于用户使用,对过滤器类重载了很多定义函数,过滤器类库声明如下:
[URL=][/URL]
publicclassCanFilter
{
publicCanFilter(boolenable);
publicCanFilter(uintid,uintmask);
publicCanFilter(uintid0,uintid1,boolIsRemote);
publicCanFilter(uintid,uintmask,boolIsRemote,boolIsMaskMode);
publicCanFilter(ushortid0,ushortmask0,ushortid1,ushortmask1);
publicCanFilter(boolIsMaskMode,boolIsFifo0,boolIsWidth32,uintdata1,uintdata2);
publicCanFilter(ushortid0,ushortid1,ushortid2,ushortid3,boolIsRemote);
publicCanFilter(ushortid0,ushortmask0,ushortid1,ushortmask1,boolIsRemote,boolIsMaskMode);
}
[URL=][/URL]
对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 抬起
}
2 主控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个灯。
2 从设备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.
第二步:数据接收
?
static void can_DataReceived(int canPort,int parameter)
{
int count = can.DatasToRead;
CanData data =new CanData();
for (int i = 0; i < count; i++)
{
can.Read(data);
int index = data.Data[0];
LameState[index] = !LameState[index];
lamp[index].OnDraw(index, LameState[index]);
}
}
2 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