WindowsCE.Net下CAN卡的驱动程序设计
staric DWORD WINAPI CAN_EventHanle(LPVOID lpParam)
{
ASSERT(lpParam);
LPCAN_HW_OPEN_INFO hCan=(LPCAN_HW_OPEN_INFO)lpParam;
CanCardMessageBuf bufMsg;
while(TEUE)
{ /*循环等待CAN卡消息产生,然后进行处理*/
::WaitForSingleObject(hCan->lpCanHWInfo->hCanEvent,0XFFFFFFFF);
if(hCan->lpCanHWInfo->bKillCanThread) break; /*若CAN线程已关闭则中断*/
if(CAN_RecvMessage(hCan,&hufMsg)){ /*正确接收数据后*/
CAN_RecvBufPush(hCan,&bufMsg);} /*将数据压入缓冲*/
BYTE byV=CANR(hCan,3); /*将3号寄存器读出然后立即写入*/
CANW(hCan,3,byV);/*能够获取每次中断*/
InterruptDone(hCan->lpCanHWInfo->lpCanObj->dwSysIrqt);
} /*本次中断结束,等待下次中断*/
return 0;
}
2.6 其它函数
为了提供更多的功能和更方便地使用CAN卡进行通信,在CAN卡驱动程序中还设计了一些函数如CAN_Config用CAN卡信息配置、CAN_RecvBufPop用于处理接收缓冲区、CAN_Reset用于复位CAN卡、CheckHWInfo用于硬件信息检查等。这些函数提供了对CAN通信卡的设置、检查等功能,在这里不再详述了。
3 CAN卡驱动封装设计
CAN卡底层驱动函数虽然功能完整,但是对于用户使用比较复杂并且一般用户不需要了解底层实现的机制。为了便于使用,最后对CAN卡的驱动进行了封装,提供CanOpenFile、CanSendMsg等五个函数用于CAN总线的通信,以动态连接库(DLL)的形式提供给用户调用。封装函数及功能如下:
*CanOpenFile;初始化并打开CAN卡的一个端口。
*CanCloseFile;关闭由CanOpenFile打开的CAN卡端口。
*CanRecvMsg;接收CAN卡数据,打开CAN卡时必须具有GENERIC_READ权限。
*CanSendMsg;通过CAN卡发送数据。打开CAN卡时必须具有GENERIC_WRITE权限。
*CanIOControl;设置或获取CAN卡I/O参数支持的I/O控制包括:IOCTL_CAN_CONFIG,IOCTL_CAN_RESET,IOCTL_CAN_TIMEOUT,IOCTL_CAN_SENDREADY,IOCTL_CAN_RECVREADY。
下面是CanSendMsg函数实现的代码:
BOOL CanSendMSg(
HANDLE hCan,
LPCanCardMessageBuflpMsg)
《WindowsCE.Net下CAN卡的驱动程序设计(第5页)》