使用 C#进行 CAN 总线编程 —— 基于 WINCE 平台 C#编程要点之三
英创 ARM9 系列嵌入式主板,如 EM9000 、 EM9260 均带有(或可选) CAN 总线接口, 英创公司不仅提供了硬件平台支持,还提供了 CAN 总线通讯驱动程序。本文主要介绍在基 于 Windows CE 平台的英创嵌入式主板下进行 C# ( Microsoft Visual Stdio.Net 2005 ) CAN 总 线应用程序开发时会常常用到的一些功能函数以及开发方法。 在英创嵌入式主板上进行 CAN 编程的思路是:
( 1 ) 使用 Win32 的 CreateFile 方法 (类似于传统操作串口的模式) 来获得操作 CAN 总线端口的 Handle 。
( 2 ) 使用英创公司提供的 CAN 总线驱动程序动态链接库 CAN_API_DLL.dll 实现一系 列的 CAN 通讯操作,包括: CAN_StartChip、CAN_SetBaudRate、CAN_SetGlobalAcceptanceFilter、CAN_GetNextReceivedFrame、 CAN_SendFrame、CAN_StartChip等方法。
( 3 ) 使用 Win32 的 CloseHandle 方法关闭 CAN 操作的 Handle。
在使用 C# 编程操作 CAN 通讯之前,首先要明确:很多底层操作的函数(如 CreateFile 函 数) , Visual Studio 2005.NET 的 API 库中并没有提供,这个时候,我们就要在 C# 开发中调用 Win32 的函数来进行相应的操作。 一大批 Win32 底层操作的函数都存在于 cordll.dll 动态链接库 中。
调用 Win32 的申明:
using System.Runtime.InteropServices;
要使用的两个 Win32 函数申明如下:
同样,英创公司提供的驱动程序动态链接库函数也需要进行申明如下:
一、启动 CAN 接口 启动 CAN 接口一般只需要按顺序进行如下四个函数的调用:
CANhandle = CreateFile(strPort, GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
// 注意: strPort 是一个字符串,定义 CAN 端口的名称,如“ CAN1: ”或“ CAN2: ”
CAN_StartChip(CANhandle); // 如下三个函数的定义请见上文注释
CAN_SetBaudRate(CANhandle, BaudrateSerialno);
CAN_SetGlobalAcceptanceFilter(CANhandle, ACCFilter, 9);
注意: ACCFilter 是一个长度为 9 的字符串数组,请在调用之前安装相关设置进行初始化。 二、数据发送 启动 CAN 接口后,就可进行 CAN 通讯了。 CAN 的数据帧分标准帧和扩展帧两种,其区 别如下图所示:
四、关闭 CAN 接口
关闭 CAN 接口一般只需要按顺序进行如下二个函数的调用即可实现:
CAN_StopChip(CANhandle);
CloseHandle(CANhandle);