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

📄 unit1.pas

📁 为在Delphi中使用Winpcap 写的。Delphi6和Delphi2007中测试通过。需先安装Winpcap的驱动3.1.
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    ComboBox_NetCard: TComboBox;
    Label1: TLabel;
    BitBtn_Open: TBitBtn;
    BitBtn_Sent: TBitBtn;
    Memo_Rec: TMemo;
    BitBtnRecData: TBitBtn;
    ComboBox_DDSFre: TComboBox;
    Label2: TLabel;
    Label3: TLabel;
    ComboBox1_SignFre: TComboBox;
    Label4: TLabel;
    Label5: TLabel;
    Timer1: TTimer;
    Label6: TLabel;
    SaveDialog1: TSaveDialog;
    Edit_Save: TEdit;
    Edit_Syn: TEdit;
    Label7: TLabel;
    procedure FormShow(Sender: TObject);
    procedure BitBtn_OpenClick(Sender: TObject);
    procedure BitBtn_SentClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BitBtnRecDataClick(Sender: TObject);
    procedure Edit_SaveDblClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const MAX_PACKET_LEN  =	1536;  //以太网数据包的最大长度

//成功返回0 不成功返回-1

//获得网卡的数目
function GetNetCardCount():integer;stdcall;external 'WinPcapNetCardIO.dll';
//获得指定网卡的ID号
//CardIndex  网卡序号 0->
//NameBuf[]  输出的网卡名字
function GetNetCardName(CardIndex:integer;NameBuf:pchar):integer;stdcall;external 'WinPcapNetCardIO.dll';
//获得指定网卡的描述
//CardIndex  网卡序号 0->
//DSBuf[]    输出的网卡描述信息
function GetNetCardDescription(CardIndex:integer;DSBuf:pchar):integer;stdcall;external 'WinPcapNetCardIO.dll';
//打开指定网卡 
//CardIndex  网卡序号 0->
//FilterStr  地址过滤格式 AA:BB:CC:DD:EE:FF 关系到数据接受和发送不能设错
//BufSize	 磁盘缓冲区的大小 单位M
function OpenNetCard(CardIndex:integer;FilterStr:pchar;BufSize:byte):integer;stdcall;external 'WinPcapNetCardIO.dll';
//关闭打开的网卡
function CloseNetCard():integer;stdcall;external 'WinPcapNetCardIO.dll';
//向打开的网卡发送数据报,可自动添加网络数据头12字节数据
//Pdata		数据指针
//Length    数据长度
//HeadFill  是否自动添加12字节的网络数据包头
function NetCardSentData(Pdata:pchar;Length:integer;HeadFill:integer):integer;stdcall;external 'WinPcapNetCardIO.dll';
//从打开的网卡中读取数据
//Pdata		数据指针
//Length    数据长度
//返回值	<0出错了 >0读出成功或不够 比较返回值和Length是否相等即可 每次最多一包1536Byte
function NetCardRecData(Pdata:pchar;Length:integer):integer;stdcall;external 'WinPcapNetCardIO.dll';

var
  Form1: TForm1;
  RecDataBuf:array[0..1000] of char;
  filestream:Tfilestream;
  RecPacket : longword; 
implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CloseNetCard();
end;

procedure TForm1.FormShow(Sender: TObject);
var
NetCount:integer;
NetCardInfor:array[0..255] of char;
tempstr:string;
i:integer;
begin
   NetCount := GetNetCardCount();
   for i:=0 to NetCount-1 do
   begin
        NetCardInfor := '';
        GetNetCardDescription(i,NetCardInfor);
        tempstr := NetCardInfor;
        copy(tempstr,1,pos('   ',tempstr));
        ComboBox_NetCard.Items.Add(tempstr);
   end;

   if(NetCount<>0)   then
   form1.ComboBox_NetCard.ItemIndex:=0;
end;

procedure TForm1.BitBtn_OpenClick(Sender: TObject);
var
  TargetAddr:array[0..5] of char;
begin
//目标地址

  TargetAddr[0] := #$aa;
  TargetAddr[1] := #$bb;
  TargetAddr[2] := #$cc;
  TargetAddr[3] := #$dd;
  TargetAddr[4] := #$ee;
  TargetAddr[5] := #$ff;
//打开网卡
if(BitBtn_Open.Caption = '打开网卡')    then
begin
        if(OpenNetCard(form1.ComboBox_NetCard.ItemIndex,TargetAddr,32)= 0)then
        begin
                BitBtn_Open.Caption := '关闭网卡';
                Memo_Rec.Lines.Add('网卡打开,目标地址:aa:bb:cc:dd:ee:ff, 缓存32M,');
        end;
end
else
begin
       CloseNetCard();
       BitBtn_Open.Caption := '打开网卡';
       Memo_Rec.Lines.Add('网卡关闭');
end;

end;

procedure TForm1.BitBtn_SentClick(Sender: TObject);
var
  ComBuf:array[0..9] of char;
  Fre:double;
  Bit32Fre:longword;
begin
	ComBuf[0]:=#129;  //控制命令的标志字

	//设定DDS仿真信号的频率,0xB8000000 即57.5MHz
	//计算方法为:(信号的中频 -80MHz)/80MHz*2^32
        Fre := strtofloat(ComboBox_DDSFre.text); //信号
        Fre := (Fre-1562.5);                     //中频
        //算法
        Bit32Fre := round((Fre-80)* high(longword)/80 );
	ComBuf[1]:=chr(Bit32Fre);     //最低8位
	ComBuf[2]:=chr(Bit32Fre shr 8);
	ComBuf[3]:=chr(Bit32Fre shr 16);
	ComBuf[4]:=chr(Bit32Fre shr 24);  //最高8位

	//设定接收信号的频率,0xB8000000 即57.5MHz=137.5MHz,计算方法同上
	//接收信号的频率与卫星有关,一般是137.5MHz,但考虑到今后的扩展,建议将该值可由用户在界面上进行设定

        //对于低分辨的信号而言,射频频率为:1691MHz,本振频率为1562.5MHz,经过混频后的中频频率为128.5MHz
	//则需设定的值为:(128.5-80)/80*2^32 = 0x9B333333

        Fre := strtofloat(ComboBox1_SignFre.text); //信号
        Fre := (Fre-1562.5);                     //中频
        //算法
        Bit32Fre := round((Fre-80)* high(longword) /80);
	ComBuf[5]:=chr(Bit32Fre);         //最低8位
	ComBuf[6]:=chr(Bit32Fre shr 8);
	ComBuf[7]:=chr(Bit32Fre shr 16);
	ComBuf[8]:=chr(Bit32Fre shr 24);  //最高8位

  //接受门限
  ComBuf[9]:=chr(strtoint(Edit_Syn.Text));


        if(NetCardSentData(ComBuf,10,1)= 0)  then
         begin
                Memo_Rec.Lines.Add('设定指令发送成功');
        end
        else
        begin
                Memo_Rec.Lines.Add('设定指令发送失败');
        end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

  form1.Timer1.Enabled:=false;

  if(NetCardRecData(RecDataBuf,1000)=1000)then
  begin
      filestream.WriteBuffer(RecDataBuf,1000);
      RecPacket := RecPacket + 1;

      form1.Memo_Rec.Lines.Add('接受到数据:' + inttostr(RecPacket) +'KB');

      if(form1.Memo_Rec.Lines.Count>=1000) then
        form1.Memo_Rec.Clear;

  end;

  form1.Timer1.Enabled:=(BitBtnRecData.Caption = '停止读取');
end;

procedure TForm1.BitBtnRecDataClick(Sender: TObject);
var
 FileName:string;
begin
if(BitBtnRecData.Caption = '读取数据')    then
begin
        form1.Timer1.Enabled:=true;
        
        Createdir(Edit_Save.Text);
        FileName :='\卫星数据'+Datetimetostr(Now)+'.dat';
        
        insert('-',FileName,pos(':',FileName));
        delete(FileName,pos(':',FileName),1);
        insert('-',FileName,pos(':',FileName));
        delete(FileName,pos(':',FileName),1);

        FileName := Edit_Save.Text+ FileName;

        filestream:=Tfilestream.Create(FileName,fmCreate);
        BitBtnRecData.Caption := '停止读取';
        Memo_Rec.Lines.Add('建立文件'+FileName+'读取数据');

        RecPacket:=0;
        //form1.Label_RecKB.Caption:='0 KB';
end
else
begin
        form1.Timer1.Enabled:=false;
        BitBtnRecData.Caption := '读取数据';
        Memo_Rec.Lines.Add('停止读取数据');
end;

end;

procedure TForm1.Edit_SaveDblClick(Sender: TObject);
begin
form1.SaveDialog1.FileName:=Edit_Save.Text;
form1.SaveDialog1.Execute;
if(form1.SaveDialog1.FileName<>'')then
   Edit_Save.Text := form1.SaveDialog1.FileName;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -