WindowsCE.Net下CAN卡的驱动程序设计
{byV=CANR(hCan,2);
if(byV & 0X40) /*传输缓冲区满,退出*/
{break;}
if(byV & 0X8){ /*传输结束,正确返回退出*/
bSuc = TRUE;
break;}
}
::LeaveCriticalSection(&hCan->lpCanHWInfo->TransmitCritSec); /*离开临界区*/
return bSuc;
}
2.4 CAN卡信息接收
CAN卡的信息接收是发送的逆过程,当接收缓冲区标志为1时,表示缓冲区已满可以接收数据,将数据接收到数组后释放接收缓冲区,然后对接收到的数据进行分解并存储到CAN卡信息缓冲区的结构体。接收缓冲区的寄存器结构如表2所列。
CAN消息接收函数的实现如下:
BOOL CAN_RecvRecvMessage(LPCAN_HW_OPEN_INFO
HCan,OUT LPCanCardMessageBuflpMsg)
{……
if(CANR(hCan,2)&1){ /*判断接收缓冲区是否已满*/
for(UINT i=0;i<10;++i)
recvBuf[i]=CANR(hCan,20+i);/*将数据暂存到临时缓冲区*/
CANW(hCan,1,4); /*释放接收缓冲区*/
LpMsg->dwMsgID=recvBuf[0]<<3; /*取出ID的高8位*/
BYTE byV =recvBuf[1];
LpMsg->dwMsgID+=byV >>5;/*取出ID低3位,然后和高8位合并*/
LpMsg->bRTR =byV &0x10?TRUE:/*返回RTR状态*/
LpMsg->dwMessageLen = byV &0XF; /*返回数据长度*/
……
}
else
{++hCan->lpCanHWInfo->dwErrorMsgCount;}/*没有收到数据,错误计数加1*/
::LeaveCriticalSection(&hCan->lpCanHWInfo->
ReceiveCritSec); /*离开临界区*/
Return bSuc;
}
2.5 CAN卡事件处理
CAN卡事件处理函数是CAN卡驱动程序中很重要的部分。驱动设计要求具有消息通知的功能,当事件发生时及时捕获事件并进行消息处理。
下面是事件处理函数的实现:
《WindowsCE.Net下CAN卡的驱动程序设计(第4页)》