📄 unit1.~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是否相等即可
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 + -