⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.pas

📁 CAN测试程序。华控CAN50模块(can转usb)的测试程序(VC
💻 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 + -