昨天接到了一个任务,为紫金桥实时数据库开发一个简单的驱动程序。由于协议十分简单,个人觉得有助于新手入门,就放到论坛上,首先声明,适用于新手,高手不要用砖拍我。
这个协议是个报警器的的协议。
波特率:9600
数据格式:1位起始位,8位数据,1位停止位,无奇偶校验
握手方式:报警器支持被动应答和主动发送两种方式(数据以十六进制表示)。
上位机下发:AA CC 00 00 CRC
报警器上传:AA DD 00 xx CRC
注:字节xx的8位分别代表不同的报警状态
bit7:备用
bit6:备用
bit5:门开(0正常,1门开报警)
bit4:A相电压(0正常,1失电)
bit3:B相电压(0正常,1失电)
bit2:C相电压(0正常,1失电)
bit1:震动(0正常,1震动报警)
bit0:红外(0正常,1红外报警)
上位机发送请求命令,报警器就传递报警信息。
由于设备十分简单,于是不用定义设备定义对话框,直接做ioitemui.dll和ioapi.dll既可。
Ioitemui.dll负责点连接信息的输入,记录在一个IOITEMDEF结构里面,传递给驱动框架程序,然后驱动框架程序利用这些信息进行处理,然后再把这些信息传递给ioapi.dll进行设备通信。
在这个程序中IOITEMDEF 只保存了一个值就是要读的数据位的索引。
Ioapi.dll负责和设备的通信,他包含的一些类在《紫金桥®实时数据库驱动开发手册》中有详细介绍,我就不再重复。这里我主要重载了CDevice中的OnSortItem方法和CPacket类中的OnAddItem方法OnReadData方法和OnResponce方法。
其中OnSortItem方法用于对ioitemui.dll中定义的点进行排序,由于点信息只有一个,所以单单对他排序即可。
void CDevice::OnSortItem(int & nFirstKey, int & nSecondKey)
{
nFirstKey = 0;
}
OnAddItem方法用于对把点添加到包中,由于协议比较简单,所以我把所有的点都放在了一个包里面。
void CPacket::OnAddItem(CItem* pItem)
{
AddItem(pItem);
}
OnReadData发送了一个串【AA】【CC】【00】【00】【E7】【E1】代表请求数据。
int CPacket::OnReadData(char * pchSend, int & nSendLen)
{
char *pchCmd = "\xAA\xCC\x00\x00\xE7\xE1";
memcpy(pchSend, pchCmd, nSendLen = 6);
pDevice->ShowProcessMessage("读取数据!");
return SEND | WAIT;
}
报警器接收到请求命令后,则上传报警的状态【AA】【CC】【00】【XX】【YY】【YY】,其中XX代表报警状态,后面的两个YY代表CRC校验码。上位机收到回传数据后,调用OnResponce对其进行处理,读取数据并把其设置给包中的点。
BOOL CPacket::OnResponse(CItem* pItem, const char *pchRes, int nResLen, int & nDeleteLen)
{
if (nResLen < 6)
return FALSE;
CString csRcv(pchRes, nResLen);
csRcv = csRcv.Mid(csRcv.Find("\xAA\xCC"));
BYTE byData = (BYTE)csRcv【3】;
for (int i=0; i<GetItemCount(); i++)
{