作爲上位機與硬件交互產品,經常需要提供硬件產品SDK給客戶,客戶根據SDK進行二次開發的情況,今天就寫一個如何簡單的SDK,並基於串口交互(有些基於tcp網絡),只是提供一個思路。
一、定義一個上位機與硬件的交互協議類: 如下
namespace devicedapi
{
public class datapro
{
private byte Datahead; //數據包頭,
private byte DataLen; //數據包長度,數據包從‘長度’字節後面開始的字節數,不包含‘長度’字節本身
private byte DevId; //設備id
private 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 UserdataHandleCallback
private 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();
}
}
}