海康SDK檔案是用C這樣寫的:
void CALLBACK g_fSerialDataCallBack(LONG lSerialHandle, char *pRecvDataBuffer, DWORD dwBufSize, DWORD dwUser)
{
//…… 處理接收到的透傳資料,pRecvDataBuffer中存放接收到的資料
}
lTranHandle = NET_DVR_SerialStart(lUserID, iSelSerialIndex, g_fSerialDataCallBack, lUserID);//設定回呼函式獲取透傳資料
求助高手指點一下delphi應該怎樣用實作回呼函式接收資料。謝謝。
uj5u.com熱心網友回復:
有哪位用delphi做過海康SDK的開發,給一個其它功能(如預覽影像)的通過回呼函式接收資料的代碼供學習也行。求指點,多謝了。uj5u.com熱心網友回復:
哇好早哎。。沒用過,幫頂一下uj5u.com熱心網友回復:
procedure g_fSerialDataCallBack(lSerialHandle:long; pRecvDataBuffer:pchar; dwBufSize, dwUser:DWORD);stdcall;External'your.dll'uj5u.com熱心網友回復:
我遇到的問題是不確定回呼函式是否處理正確。VC是這樣使用DLL庫里的NET_DVR_SerialStart函式的:
#define NET_DVR_API extern "C"__declspec(dllimport)
NET_DVR_API LONG __stdcall NET_DVR_SerialStart(LONG lUserID,LONG lSerialPort,void(CALLBACK *fSerialDataCallBack)(LONG lSerialHandle,char *pRecvDataBuffer,DWORD dwBufSize,DWORD dwUser),DWORD dwUser); //說明函式的入口及引數
void CALLBACK g_fSerialDataCallBack(LONG lSerialHandle, char *pRecvDataBuffer, DWORD dwBufSize, DWORD dwUser)
{
//…… 撰寫一個回呼函式,處理接收到的透傳資料,pRecvDataBuffer中存放接收到的資料
}
lTranHandle = NET_DVR_SerialStart(lUserID, iSelSerialIndex, g_fSerialDataCallBack, lUserID);//初始化串口,設定回呼函式獲取透傳資料
請教在delphi中裝載時呼叫DLL怎樣定義NET_DVR_SerialStart函式入口,說明引數型別,我就是不知道怎樣處理第三個引數(是不是稱函式指標?)。
uj5u.com熱心網友回復:
procedure g_fSerialDataCallBack(lSerialHandle: Cardinal; pRecvDataBuffer: PChar; dwBufSize: Cardinal; dwUser: Cardinal);begin
//…… 處理接收到的透傳資料,pRecvDataBuffer中存放接收到的資料
end;
uj5u.com熱心網友回復:
type
//HCNetSDK頭檔案型別宣告Delphi改寫
//基本資料型別宣告
DWORD=LongWord;
//WORD:Word;
USHORT=Word;
LONG=Longint;
//BYTE=char ;
//#define BOOL int
UINT=Longword;
LPVOID=Pointer;
HANDLE=Pointer;
LPDWORD=^LongWord;
//typedef unsigned long long UINT64;
//NET_DVR_Login_V30()引數結構
type LPNET_DVR_DEVICEINFO_V30=^NET_DVR_DEVICEINFO_V30;
NET_DVR_DEVICEINFO_V30=Record
sSerialNumber:array [0..SERIALNO_LEN-1] of BYTE ; //序列號
byAlarmInPortNum:BYTE ; //報警輸入個數
byAlarmOutPortNum:BYTE ; //報警輸出個數
byDiskNum:BYTE ; //硬碟個數
byDVRType:BYTE ; //設備型別, 1:DVR 2:ATM DVR 3:DVS ......
byChanNum:BYTE ; //模擬通道個數
byStartChan:BYTE ; //起始通道號,例如DVS-1,DVR - 1
byAudioChanNum:BYTE ; //語音通道數
byIPChanNum:BYTE ; //最大數字通道個數
byZeroChanNum:BYTE ; //零通道編碼個數 //2010-01-16
byMainProto:BYTE ; //主碼流傳輸協議型別 0-private, 1-rtsp
bySubProto:BYTE ; //子碼流傳輸協議型別0-private, 1-rtsp
bySupport:BYTE ; //能力,位與結果為0表示不支持,1表示支持,
//bySupport & 0x1, 表示是否支持智能搜索
//bySupport & 0x2, 表示是否支持備份
//bySupport & 0x4, 表示是否支持壓縮引數能力獲取
//bySupport & 0x8, 表示是否支持多網卡
//bySupport & 0x10, 表示支持遠程SADP
//bySupport & 0x20, 表示支持Raid卡功能
//bySupport & 0x40, 表示支持IPSAN 目錄查找
//bySupport & 0x80, 表示支持rtp over rtsp
bySupport1:BYTE ; // 能力集擴充,位與結果為0表示不支持,1表示支持
//bySupport1 & 0x1, 表示是否支持snmp v30
//bySupport1 & 0x2, 支持區分回放和下載
byRes1:BYTE ;
wDevType:WORD ; //設備型號
byRes2:array [0..15] of BYTE ; //保留
end;
//NET_DVR_Login_V30()引數結構end
//回呼函式無回傳值宣告為程序
type fSerialDataCallBack=procedure(lSerialHandle:LONG;pRecvDataBuffer:PChar;dwBufSize:DWORD;dwUser:DWORD );//stdcall;
//type fSerialDataCallBack=procedure(lSerialHandle:LONG;pRecvDataBuffer:PChar;dwBufSize:DWORD;dwUser:DWORD )of object ;// stdcall;//external 'HCNetSDK.dll';
//自動生成
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Edit1: TEdit;
Button3: TButton;
Label2: TLabel;
Edit2: TEdit;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ErrorValues:LongWord;
szSendBuf:array [0..10] of char;
szReciBuf:array [0..10] of char;
//g_fSerialDataCallBack:fSerialDataCallBack;
lUserID:LONG;
struDeviceInfo:NET_DVR_DEVICEINFO_V30;
DVRIP,DVRUserName,DVRPassWord: String;
lTranHandle:LONG;
iSelSerialIndex:integer;
dwUser:DWORD;
lSerialChan:LONG;
//procedure g_fSerialDataCallBack(lSerialHandle:LONG;pRecvDataBuffer:PChar;dwBufSize:DWORD;dwUser:DWORD );stdcall;
implementation
{$R *.dfm}
function NET_DVR_Init():boolean;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_Init';
function NET_DVR_Cleanup():boolean;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_Cleanup';
function NET_DVR_SetConnectTime(dwWaitTime,dwTryTimes:DWORD):boolean;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_SetConnectTime';
function NET_DVR_SetReconnect(dwInterval:DWORD;bEnableRecon:boolean):boolean;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_SetReconnect';
function NET_DVR_GetLastError():LongWord;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_GetLastError';
function NET_DVR_Login_V30(sDVRIP:Pchar; wDVRPort:WORD; sUserName:Pchar; sPassword:Pchar; lpDeviceInfo:LPNET_DVR_DEVICEINFO_V30):LONG;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_Login_V30';
function NET_DVR_Logout_V30(lUserID:LONG):boolean;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_Logout_V30';
function NET_DVR_SerialStart(lUserID:LONG;iSelSerialIndex:LONG; g_fSerialDataCallBack:fSerialDataCallBack; dwUser:DWORD):LONG;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_SerialStart';
function NET_DVR_SerialStop(lTranHandle:LONG):boolean;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_SerialStop';
function NET_DVR_SerialSend(lTranHandle:LONG; lSerialChan:LONG; pSendBuf:PChar; dwBufSize:DWORD):boolean;stdcall;external 'HCNetSDK.dll' name 'NET_DVR_SerialSend';
procedure g_fSerialDataCallBack(lSerialHandle:LONG;pRecvDataBuffer:PChar;dwBufSize:DWORD;dwUser:DWORD );//stdcall;//external 'HCNetSDK.dll' ;
begin
messagedlg('回呼程序!',mterror,[mbyes],0);
szReciBuf[0] := pRecvDataBuffer[0];
szReciBuf[1] := pRecvDataBuffer[1];
szReciBuf[2] := pRecvDataBuffer[2];
szReciBuf[3] := pRecvDataBuffer[3];
szReciBuf[4] := pRecvDataBuffer[4];
szReciBuf[5] := pRecvDataBuffer[5];
szReciBuf[6] := pRecvDataBuffer[6];
szReciBuf[7] := pRecvDataBuffer[7];
szReciBuf[8] := pRecvDataBuffer[8];
szReciBuf[9] := pRecvDataBuffer[9];
szReciBuf[10] := pRecvDataBuffer[10];
end;
procedure TForm1.Button1Click(Sender: TObject); //按鍵1程序
begin
NET_DVR_Init();
NET_DVR_Cleanup();
ErrorValues:=NET_DVR_GetLastError();
Memo1.Lines.Add('ErrorValues:'+inttostr(ErrorValues));
Memo1.Lines.Add('SDK網路通信庫初始化及釋放成功');
end;
procedure TForm1.Button2Click(Sender: TObject); //開第一路
begin
DVRIP:='192.168.1.101';
DVRUserName:= 'admin';
DVRPassWord:= '12345';
NET_DVR_Init();
//設定連接時間與重連時間
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
// 登陸注冊設備
lUserID := NET_DVR_Login_V30(PChar(DVRIP), 8000, PChar(DVRUserName), PChar(DVRPassWord), @struDeviceInfo);
Memo1.Lines.Add('lUserID:'+inttostr(lUserID));
ErrorValues:=NET_DVR_GetLastError();
Memo1.Lines.Add('ErrorValues:'+inttostr(ErrorValues));
//通過485串口建立透明通道
iSelSerialIndex := 2; //1:232串口;2:485串口
lTranHandle := NET_DVR_SerialStart(lUserID, iSelSerialIndex, g_fSerialDataCallBack, dwUser); //設定回呼函式獲取透傳資料
Memo1.Lines.Add('lTranHandle:'+inttostr(lTranHandle));
if (lTranHandle < 0) then
begin
Memo1.Lines.Add('NET_DVR_SerialStart error,'+inttostr(NET_DVR_GetLastError()));
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
end;
//通過485透明通道發送資料
lSerialChan := 1; //使用485時該值有效,從1開始;232時設定為0
szSendBuf[0] := char($03); //開第一路指令資料
szSendBuf[1] := char($05);
szSendBuf[2] := char($00);
szSendBuf[3] := char($10);
szSendBuf[4] := char($FF);
szSendBuf[5] := char($00);
szSendBuf[6] := char($8C);
szSendBuf[7] := char($1D);
szSendBuf[8] := char(#0);
szSendBuf[9] := char(#0);
szSendBuf[10] := char(#0);
if (not NET_DVR_SerialSend(lTranHandle, lSerialChan, szSendBuf, sizeof(szSendBuf))) then//szSendBuf為發送資料的緩沖區
begin
Memo1.Lines.Add('NET_DVR_SerialSend error,'+inttostr(NET_DVR_GetLastError()));
NET_DVR_SerialStop(lTranHandle);
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
end;
Memo1.Lines.Add('接受資料');
Memo1.Lines.Add(#33+#33+szReciBuf[0]+szReciBuf[1]+#33);
//斷開透明通道
NET_DVR_SerialStop(lTranHandle); //注銷用戶
NET_DVR_Logout_V30(lUserID); //釋放SDK資源
NET_DVR_Cleanup();
//ErrorValues:=NET_DVR_GetLastError();
//Memo1.Lines.Add('ErrorValues:'+inttostr(ErrorValues));
end;
uj5u.com熱心網友回復:
以上是我寫的代碼,現在可以通過485介面發資料至下聯485設備并實作正確,但下聯485設備回復的資料收不到,跟蹤程式運行發現回呼程序沒有運行。海康SDK的clientdemo程式也只能收到0x0。求高人指教。我覺得是我函式指標沒處理好。uj5u.com熱心網友回復:
typefSerialDataCallBack=procedure lSerialHandle:LONG;pRecvDataBuffer:PChar;dwBufSize:DWORD;dwUser:DWORD );stdcall;
procedure g_fSerialDataCallBack(lSerialHandle:LONG;pRecvDataBuffer:PChar;dwBufSize:DWORD;dwUser:DWORD );stdcall;
begin
messagedlg('回呼程序!',mterror,[mbyes],0);
szReciBuf[0] := pRecvDataBuffer[0];
szReciBuf[1] := pRecvDataBuffer[1];
szReciBuf[2] := pRecvDataBuffer[2];
szReciBuf[3] := pRecvDataBuffer[3];
szReciBuf[4] := pRecvDataBuffer[4];
szReciBuf[5] := pRecvDataBuffer[5];
szReciBuf[6] := pRecvDataBuffer[6];
szReciBuf[7] := pRecvDataBuffer[7];
szReciBuf[8] := pRecvDataBuffer[8];
szReciBuf[9] := pRecvDataBuffer[9];
szReciBuf[10] := pRecvDataBuffer[10];
end;
uj5u.com熱心網友回復:
485設備回復的資料收不到,我用c++也遇到同樣的問題,該怎么解決uj5u.com熱心網友回復:
用pelco_d協議發送資料,發送成功,可485設備回復的資料收不到,我也是用c++遇到同樣的問題轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/104490.html
標籤:語言基礎/算法/系統設計
