网站首页banner大小重庆森林经典台词独白
作为上位机与硬件交互产品,经常需要提供硬件产品SDK给客户,客户根据SDK进行二次开发的情况,今天就写一个如何简单的SDK,并基于串口交互(有些基于tcp网络),只是提供一个思路。
一、定义一个上位机与硬件的交互协议类: 如下
namespace devicedapi
{public class datapro{private byte Datahead; //数据包头,private byte DataLen; //数据包长度,数据包从‘长度’字节后面开始的字节数,不包含‘长度’字节本身private byte DevId; //设备idprivate byte DataOpCmd; //控制指令private byte[] DataParam; //数据包命令参数,部分命令无参数private byte DataCheck; //校验和,除校验和本身外所有字节的校验和private byte[] Dataframe; //完整数据包//设置属性public byte[] DevDatafullframe{get{return Dataframe;}}public byte[] DevDataParam{get{return DataParam;}}public byte DevicedId{get{return DevId;}}public byte Cmd{get{return DataOpCmd;}}public byte DevDatahead{get{return Datahead;}}public datapro(){}// 数据包组装 //有时候需要无参数组装public datapro(byte DevId, byte DataOpCmd, byte[] DataParam){//do sonmgthing...//得到 this.DevDatafullframe}// 数据包拆分public datapro(byte[] DevDatafullframe){//do sonmgthing...//得到各个属性值}// 数据包校验public byte CheckSum(byte[] DataParam, int nLen){//do sonmgthing...//得到 DataCheck }
}
}
二、SDK设备操作方法类
1、必须定义委托方法,提供给调用者自定义去实现(类似C语言回调函数留出接口)
namesopace devicedapi
{//定义一个处理数据的委托public delegate void DataHandleCallback(datapro msgdata);public class devAPI{//给用户一个实现回调函数的接口public DataHandleCallback UserdataHandleCallbackprivate SerialPort mySerialPort; //实例化一个串口//初始化public devAPI(){mySerialPort = new SerialPort(); mySerialPort.DataReceived+=new SerialDataReceivedEventHandler(ReceivedComData); //串口接收函数 }// 打开串口连接设备public opencom(){}//关闭串口 public closecom(){}//发送数据给设备public sendmsg(){}private void ReceivedComData(object sender, SerialDataReceivedEventArgs e){//1.获取数据长度,按数据协议解析出一帧数据 msgdata//2.验证一帧数据正确性//3.调用回调函数处理数据 DataHandleCallback(msgdata);}// 操作设备的各个方法public func1(){//组装数据sengmsg();}// 操作设备的各个方法public func2(){//组装数据sengmsg(); }// 操作设备的各个方法public func3(){//组装数据sengmsg();}}}
三、将上两个类生成一个库类的工程 导出一个DEVAPI.DLL文件,就可以新建一个工程 ,实例调用。
1、引用dll
2、实例化一个设备类
3、实现用户数据处理接口
namespace mydevice
{public class newdev{private devicedapi.devAPI device ;//初始化访问读写器实例device = new devicedapi.devAPI();//实现回调函数device.DataHandleCallback = myhandle;//...private void AnalyData(devicedapi.datapro msgdata){//自定义处理接收数据} //用户操作函数public myfunc1(){device.func1();}//用户操作函数public myfunc2(){device.func2();}//用户操作函数public myfunc3(){device.func3();}}}