📄 mainfrm.pas
字号:
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls ,SyncObjs,Goalvar,SendThread,RecThread;
type
TMainForm = class(TForm)
BtnInitCard: TButton;
BtnCloseCard: TButton;
Send_Edit: TEdit;
Receive_Edit: TEdit;
BtnSendFrm: TButton;
CanType_ComboBox: TComboBox;
DrvType_ComboBox: TComboBox;
Baud_ComboBox: TComboBox;
SdPort_ComboBox: TComboBox;
RecPort_ComboBox: TComboBox;
RecType_ComboBox: TComboBox;
GroupBox1: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label1: TLabel;
Label2: TLabel;
DeviceStatus_Str: TLabel;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
BtnStopSend: TButton;
Label4: TLabel;
Label5: TLabel;
ShowProc_CheckBox: TCheckBox;
SdCycle_CheckBox: TCheckBox;
Label6: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
SdTotalCount_Edit: TEdit;
SdOKCount_Edit: TEdit;
Label17: TLabel;
SdFaileCount_Edit: TEdit;
Label18: TLabel;
Label19: TLabel;
SdFreq_Edit: TEdit;
BtnClearSendCount: TButton;
Label20: TLabel;
Label21: TLabel;
RecCount_Edit: TEdit;
BtnClearRecCount: TButton;
BtnRdDevStatus: TButton;
DevStatus_Edit: TEdit;
SdTryCount_Edit: TEdit;
Label22: TLabel; procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure BtnInitCardClick(Sender: TObject);
procedure BtnCloseCardClick(Sender: TObject);
procedure BtnSendFrmClick(Sender: TObject);
procedure BtnReceiveFrmClick(Sender: TObject);
procedure CanType_ComboBoxChange(Sender: TObject);
procedure BtnStopSendClick(Sender: TObject);
procedure BtnClearSendCountClick(Sender: TObject);
procedure BtnClearRecCountClick(Sender: TObject);
procedure BtnRdDevStatusClick(Sender: TObject);
procedure ShowProc_CheckBoxClick(Sender: TObject);
private
{ Private declarations }
Send_Thread : TSendThread;
Receive_Thread :TRecThread;
m_Handle :THandle;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
begin
m_Handle := LoadLibrary('HKCANDLL.dll');
if (m_Handle <=0) then
ShowMessage('打开HKCANDLL.dll动态链接库失败')
else begin
@HKCanOpen := GetProcAddress(m_Handle,'HKCanOpen');
if(@HKCanOpen = nil) then
ShowMessage('获取HKCanOpen()函数句柄失败!');
@HKCanClose := GetProcAddress(m_Handle,'HKCanClose');
if(@HKCanClose = nil) then
ShowMessage('获取HKCanClose()函数句柄失败!');
@HKCanInitState := GetProcAddress(m_Handle,'HKCanInitState');
if(@HKCanInitState = nil) then
ShowMessage('获取HKCanInitState()函数句柄失败!');
@HKCanSendFrame := GetProcAddress(m_Handle,'HKCanSendFrame');
if(@HKCanSendFrame = nil) then
ShowMessage('获取HKCanSendFrame()函数句柄失败!');
@HKCanReadFrame := GetProcAddress(m_Handle,'HKCanReadFrame');
if(@HKCanReadFrame = nil) then
ShowMessage('获取HKCanReadFrame()函数句柄失败!');
@HKCanAbortSend := GetProcAddress(m_Handle,'HKCanAbortSend');
if(@HKCanAbortSend = nil) then
ShowMessage('获取HKCanAbortSend()函数句柄失败!');
@HKCanGetLastError := GetProcAddress(m_Handle,'HKCanGetLastError');
if(@HKCanGetLastError = nil) then
ShowMessage('获取HKCanGetLastError()函数句柄失败!');
end;
g_hReadEvent_port[0] := Tevent.Create(nil,TRUE,FALSE,'');
g_hReadEvent_port[1]:= Tevent.Create(nil,TRUE,FALSE,'');
if(g_hStartSendEvent=nil) then
g_hStartSendEvent:= Tevent.Create(nil,TRUE,FALSE,'');
g_ReadThreadFlag:=TRUE; //thread flag
g_SendThreadFlag:=TRUE; //thread flag
//创建接收线程
Send_Thread := TSendThread.Create(TRUE);
Send_Thread.Init(SdTotalCount_Edit,SdOKCount_Edit,SdFaileCount_Edit);
//创建发送线程
Receive_Thread :=TRecThread.Create(TRUE);
Receive_Thread.Init(Receive_Edit,RecCount_Edit);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
//exit readthread for wait infinite
g_ReadThreadFlag :=FALSE;
g_SendThreadFlag :=FALSE;
g_hReadEvent_port[1].SetEvent();
g_hReadEvent_port[0].SetEvent();
//stop send thread
g_hStartSendEvent.SetEvent();
Sleep(300); //用于等待发送、接收线程的关闭
//close all handle
g_hReadEvent_port[0].Destroy();
g_hReadEvent_port[1].Destroy();
g_hStartSendEvent.Destroy();
Send_Thread.Destroy();
Receive_Thread.Destroy();
//close device
g_blOpenStatus := false;
if(g_mDevHandle.mHandle <> 0) then
HKCanClose(@g_mDevHandle);
if(m_Handle > 0) then
FreeLibrary(m_Handle);
end;
procedure TMainForm.BtnInitCardClick(Sender: TObject);
var
CAN_Name :array[0..255] of char;
CanBPS :cardinal;
Status :boolean;
Port :integer;
CAN_Mask :byte;
DrType :integer;
nDev :integer;
CAN_StationAddress :integer;
begin
g_RecPortNo := RecPort_ComboBox.ItemIndex;
g_SendPortNo := SdPort_ComboBox.ItemIndex;
g_RecMode := RecType_ComboBox.ItemIndex;
g_ShowProcess := ShowProc_CheckBox.Checked;
case CanType_ComboBox.ItemIndex of
0: CAN_Name:='HKCAN10';
1: CAN_Name:='HKCAN20';
2: CAN_Name:='HKCAN30';
3: CAN_Name:='HKCAN50';
else
CAN_Name:='HKCAN30';
end;
case Baud_ComboBox.ItemIndex of
0 :// 1M
CanBPS := $c0a3;
1://500K
CanBPS := $c1a3;
2 ://250K
CanBPS := $c3a3;
3 ://125K
CanBPS := $c7a3;
4 ://50K
CanBPS := $c7af;
5 ://20K
CanBPS := $c7c4;
6 ://10K
CanBPS := $c7c9;
7 ://5K
CanBPS := $ffff;
else
CanBPS := $c1a3;
end;
DrType := DrvType_ComboBox.ItemIndex;
nDev :=0;
Status := HKCanOpen(@g_mDevHandle, CAN_Name, DrType, nDev);
if(g_blOpenStatus =TRUE) then
begin
ShowMessage('CAN 卡已经打开!');
exit;
end;
If Status Then
begin
DeviceStatus_Str.Caption := 'CAN卡打开成功!';
Port := 0;
CAN_StationAddress := 0;
CAN_Mask := 255;
g_blOpenStatus :=true;
if(g_RecPortNo = 0) or ( g_SendPortNo = 0) then
begin
Status := HKCanInitState(@g_mDevHandle, Port, CanBPS, CAN_StationAddress, CAN_Mask, g_hReadEvent_port[0].handle);
If Status Then
begin
//启动线程
if(g_RecPortNo =0) then
Receive_Thread.Resume();
if(g_SendPortNo=0) then
Send_Thread.Resume();
end Else begin
g_blOpenStatus := false;
ShowMessage (' CAN Port0 卡初始化失败!! ');
end;
end;
if(g_RecPortNo = 1) or ( g_SendPortNo = 1) then
begin
If(CAN_Name <> 'HKCAN50') and (CAN_Name <> 'HKCAN20') then //CAN50、CAN20只有端口0
begin
Port := 1;
Status := HKCanInitState(@g_mDevHandle, Port, CanBPS, CAN_StationAddress, CAN_Mask, g_hReadEvent_port[1].handle);
If Status Then
begin
//启动线程
if(g_RecPortNo =1) then
Receive_Thread.Resume();
if(g_SendPortNo=1) then
Send_Thread.Resume();
end Else begin
g_blOpenStatus := false;
ShowMessage (' CAN Port1 卡初始化失败!! ');
end;
end;
end;
end Else begin
g_blOpenStatus := false;
ShowMessage (' CAN 卡打开失败!! ');
end;
end;
procedure TMainForm.BtnCloseCardClick(Sender: TObject);
var
x :boolean;
begin
if(g_blOpenStatus= TRUE) then
begin
g_blOpenStatus := false;
Receive_Thread.Suspend();
Send_Thread.Suspend();
x :=HKCanClose(@g_mDevHandle);
if(x = FALSE) then
begin
ShowMessage('CAN卡关闭失败!');
DeviceStatus_Str.Caption := 'CAN卡关闭失败!';
end else
DeviceStatus_Str.Caption := 'CAN卡关闭成功!' ;
end;
end;
procedure TMainForm.BtnSendFrmClick(Sender: TObject);
var
strLeng :integer;
begin
if g_blOpenStatus=false then
begin
ShowMessage(' CAN 卡还未初始化!!');
exit;
end;
if(Send_Edit.Text='') then
exit;
g_hStartSendEvent.ResetEvent();
g_hReadEvent_port[0].SetEvent();
g_hReadEvent_port[1].SetEvent();
g_blCycleSend := SdCycle_CheckBox.Checked;
g_TryCount := strtoint(SdTryCount_Edit.Text);
g_SendFrame.Port := g_SendPortNo;
g_SendTotalCount :=0;
g_SendOKCount :=0;
g_SendFailCount :=0;
//根据协议来定
g_SendFrame.mFrame[0] := 10;
g_SendFrame.mFrame[1] := 136;
For strLeng := 2 To 9 do
begin
g_SendFrame.mFrame[strLeng] := ord(Send_Edit.Text[strLeng-1]);
end;
g_hStartSendEvent.SetEvent();
g_SendStarTime := GetTickCount();
end;
procedure TMainForm.BtnReceiveFrmClick(Sender: TObject);
var
Status :integer;
Port :integer;
count :integer;
begin
if g_blOpenStatus=false then
begin
ShowMessage(' CAN 卡还未初始化!!');
exit;
end;
//CAN50只有端口0
if CanType_ComboBox.ItemIndex = 3 then
Port :=0
else
Port :=1;
if g_mDevHandle.mHandle <> 0 then
begin
Status := HKCanReadFrame(@g_mDevHandle,Port,@g_RecFrame);
if Status <0 then
ShowMessage(' 读取操作失败!! ')
else begin
Receive_Edit.Text :='';
for count :=2 to 9 do
Receive_Edit.Text :=Receive_Edit.Text+ char(g_RecFrame.mFrame[count]);
end;
end;
end;
procedure TMainForm.CanType_ComboBoxChange(Sender: TObject);
begin
if(CanType_ComboBox.ItemIndex =1) or (CanType_ComboBox.ItemIndex =3) then
begin
RecPort_ComboBox.ItemIndex := 0;
RecPort_ComboBox.Enabled := FALSE;
SdPort_ComboBox.ItemIndex := 0;
SdPort_ComboBox.Enabled :=FALSE;
end else begin
RecPort_ComboBox.ItemIndex := 1;
RecPort_ComboBox.Enabled := TRUE;
SdPort_ComboBox.ItemIndex := 0;
SdPort_ComboBox.Enabled :=TRUE;
end;
end;
procedure TMainForm.BtnStopSendClick(Sender: TObject);
var
MdTime :Cardinal ;
count :integer;
itemp :integer;
begin
// TODO: 在此添加控件通知处理程序代码
g_hStartSendEvent.ResetEvent();
MdTime := GetTickCount() - g_SendStarTime;
itemp := 1000*g_SendOKCount div MdTime;
SdFreq_Edit.Text := inttostr(itemp);
SdTotalCount_Edit.Text := inttostr(g_SendTotalCount);
SdOKCount_Edit.Text := inttostr(g_SendOKCount);
SdFaileCount_Edit.Text := inttostr(g_SendFailCount);
RecCount_Edit.text := inttostr(g_RecCount);
Receive_Edit.Text :='';
for count :=2 to 9 do
Receive_Edit.Text :=Receive_Edit.Text+ char(g_RecFrame.mFrame[count]);
end;
procedure TMainForm.BtnClearSendCountClick(Sender: TObject);
begin
g_SendTotalCount :=0;
g_SendOKCount :=0;
g_SendFailCount :=0;
SdFreq_Edit.Text := '0';
SdTotalCount_Edit.Text := '0';
SdOKCount_Edit.Text := '0';
SdFaileCount_Edit.Text := '0';
end;
procedure TMainForm.BtnClearRecCountClick(Sender: TObject);
begin
g_RecCount :=0;
RecCount_Edit.text := '0';
end;
procedure TMainForm.BtnRdDevStatusClick(Sender: TObject);
var
Status : longword;
begin
if(HKCanGetLastError(@g_mDevHandle,@Status)=true) then
DevStatus_Edit.Text := inttostr(Status);
end;
procedure TMainForm.ShowProc_CheckBoxClick(Sender: TObject);
begin
g_ShowProcess :=ShowProc_CheckBox.Checked;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -