关键词:无线数据传输,二次开发包
1. 项目概念
远程无线数传软件开发包的软件基于Windows操作系统,采用Delphi开发,数据库采用SQL Server2000作为后台数据库。系统以简易可行的方法实现了远程无线数传技术,实时数据库的数据校验和写入。经过了实际的检验,现已成功稳定运行。
2. 远程无线数传软件开发包的无线传输模式
3. 远程无线数传软件开发包的数据流程图
4. 无线数传设备选型
采购深圳市科易连通讯设备有限公司生产的KYL-320I无线数传模块,具体参数如下:
载波频率: 433MHz, 450MHz,470MHz,868MHz,915MHz等 ISM频点;
多种可选的通讯接口:RS-232、TTL、 RS-485、USB;
8个通讯信道,也可根据客户要求扩展;
传输数率:1200、2400、4800、9600、19200、38400bps;
数据格式:8N1/8E1/8O1(也可提供其它格式,如9位数据位);
收发一体,半双工工作模式;
低功耗,并具有休眠功能;
工作温度:-35℃ ~ +75℃(工业级);
天线阻抗:50Ω(标配为SMA,可定制);
供电电源: DC 5V (可根据用户要求定制);
输出功率: ≤500mW;(可根据用户要求定制)
接收电流: <28mA(TTL接口);
接收灵敏度:-123dBm (1200bps) ;
-118dBm (9600bps)
发射电流: <350mA;
休眠电流: <20uA;
传输距离:2km 以上(BER=10-5@9600bps,标配10cm天线,空旷地,天线高度1.5m);
3Km 以上(BER=10-5@1200bps,标配10cm天线,空旷地,天线高度1.5m);
外型尺寸:80mm×45mm×20mm (不包括天线接头 )。
模块如下图
5. 系统设计
系统设计包括以下主要模块:字符信息转换设计,发送模块设计,接收模块设计,信息加密设计,系统初始化设计。以下是各模块的详细设计
1. 字符信息转换设计
字符信息转换设计所要完成的工作是将字段内容信息转换为无线电信号能够识别的二进制信息,同时在接收端收到信息后又能准确无误的将这些二进制信息还原成正确的字段内容信息,这部分是基础性工作。
1 二进制十六进制相互转换函数编写
//把二进制串转换成十六进制串或相反
function BinToHexEachOther(ValueA : string; Action : Boolean) : string;
var
ValueArray1 : Array [0..15] of string[4];
ValueArray2 : Array [0..15] of char;
i : shortint;
begin
//数组初始化
ValueArray1[0] := '0000'; ValueArray1[1] := '0001'; ValueArray1[2] := '0010';
ValueArray1[3] := '0011'; ValueArray1[4] := '0100'; ValueArray1[5] := '0101';
ValueArray1[6] := '0110'; ValueArray1[7] := '0111'; ValueArray1[8] := '1000';
ValueArray1[9] := '1001'; ValueArray1[10] := '1010'; ValueArray1[11] := '1011';
ValueArray1[12] := '1100'; ValueArray1[13] := '1101'; ValueArray1[14] := '1110';
ValueArray1[15] := '1111';
for i := 0 to 15 do
if i >= 10 then ValueArray2[i] := chr(65 + (i - 10))
球王会体育官网else ValueArray2[i] := inttostr(i)[1];
Result := '';
if Action then
begin //二进制串转换成十六进制串
if (Length(ValueA) MOD 4 <> 0) then
ValueA := stringofchar('0',Length(ValueA) MOD 4) + ValueA;
while (Length(ValueA) >= 4) do
begin
for i := 0 to 15 do
if Copy(ValueA,1,4) = ValueArray1[i] then
Result := Result + ValueArray2[i];
ValueA := Copy(ValueA,5,Length(ValueA) - 4);
end;
end
else begin //十六进制串转换成二进制串
while (Length(ValueA) >= 1) do
begin
for i := 0 to 15 do
if Copy(ValueA,1,1) = ValueArray2[i] then
Result := Result + ValueArray1[i];
ValueA := Copy(ValueA,2,Length(ValueA) - 1);
end;
end;
end;
2 二进制与字符串互相转换函数编写
//把字符串转化为二进制数
Function ConvertStrToBin(Value : string):string;
var tempHex : string[255];
i : integer;
begin
Result := '';
if trim(Value) = '' then Exit;
tempHex := '';
for i := 1 to Length(Value) do
begin
tempHex := IntToHex(Ord(Value[i]),2);//每个字符转成两位十六进制数
Result := Result + BinToHexEachOther(tempHex,False);//十六进制转成二进制
end;
end;
function HexCharToInt(HexToken : char):Integer;
begin
Result:=0;
if (HexToken>#47) and (HexToken<#58) then { chars 0....9 }
Result:=Ord(HexToken)-48
else if (HexToken>#64) and (HexToken<#71) then { chars A....F }
Result:=Ord(HexToken)-65 + 10;
end;
//把二进制数据转化为字符串
Function ConvertBinToStr(Value : string):string;
Var tempHex : string;
i, tempInt : integer;
begin
Result := '';
if trim(Value) = '' then Exit;
tempHex := BinToHexEachOther(Value,true);//二进制转成十六进制
i := 0;
Repeat
begin
i := i + 1;
tempInt := HexCharToInt(tempHex[i]);
i := i + 1;
tempInt := tempInt * 16 + HexCharToInt(tempHex[i]);
//以上将两位十六进制数转变为一个十进制数
Result := Result + chr(TempInt); //转成ASCII码
end;
Until i >= length(tempHex)
end;
2. 发送模块设计
发送模块设计是完成将二进制信息用相应的载波频率发送出去,分为数据监听、无线电间隔识别码、数据发送和数据校验4个步骤。
1 数据监听
//如果数据缓冲区有数据,则实时转换2进制数据,同时完成表字段的数据校验写入。
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
ComPort1.ReadStr(Str, Count);
Memo2.Text:=Memo2.Text+Str;
if memo2.Text <> '0' then
begin
Button5.Click;
Timer1.Enabled:=true;
end;
end;
2 无线电间隔识别码
//将表字段对应的值转换为2进制后发送,前2位数字为无线电间隔码,#号符为本条记录发送完毕识别码。调用SendString过程发送数据。
procedure TForm1.Button6Click(Sender: TObject);
begin
SendString(ConvertStrToBin('a1')+ConvertStrToBin(edit1.Text));
SendString(ConvertStrToBin('b1')+ConvertStrToBin(edit2.Text));
SendString(ConvertStrToBin('c1')+ConvertStrToBin(edit3.Text));
SendString(ConvertStrToBin('d1')+ConvertStrToBin(edit4.Text));
SendString(ConvertStrToBin('#'));
3 end;
4 数据发送过程
//发送数据的过程。
procedure TForm1.SendString(const str: string);
var
obj:PAsync;
begin
InitAsync(obj);
try
ComPort1.WriteStrAsync(str,obj);
ComPort1.WaitForAsync(obj);
finally
DoneAsync(obj);
end;
end;
④数据校验
//引入时钟实时监听,并根据回传符号判断数据发送是否成功。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (edit1.text=edit5.text) and (edit2.text=edit6.text) and (edit3.text=edit7.text) and (edit4.text=edit8.text) and (edit9.text='$') then
begin
{SendString(ConvertStrToBin('a1')+ConvertStrToBin(edit5.Text));
SendString(ConvertStrToBin('b1')+ConvertStrToBin(edit6.Text));
SendString(ConvertStrToBin('c1')+ConvertStrToBin(edit7.Text));
SendString(ConvertStrToBin('d1')+ConvertStrToBin(edit8.Text));}
SendString(ConvertStrToBin('@'));
Timer1.Enabled :=false;
Button4.Click;
memo3.Clear;
dialogs.showmessage('发送成功');
end
else
begin
SendString(ConvertStrToBin('+'));
Timer1.Enabled:=false;
Button4.Click;
memo3.Clear;
dialogs.showmessage('发送失败!');
end;
end;
3. 接收模块设计
接收模块设计完成对接收的二进制信息进行解析并实时写入数据库保存,分为数据解析、数据写入和数据界定3个步骤
1 数据解析
//将接收到的2进制数据转换为字符串,并截获出对应的字段值,即对号入座。
procedure TForm1.Button5Click(Sender: TObject);
begin
memo3.Text :=ConvertBinToStr(memo2.Text) ;
edit5.Text:= GetStr(memo3.Text,'a1','b1') ;
edit6.Text:= GetStr(memo3.Text,'b1','c1') ;
edit7.Text:= GetStr(memo3.Text,'c1','d1') ;
edit8.Text:= GetStr(memo3.Text,'d1','#') ;
edit9.Text:= RightStr(memo3.Text,1);
end;
2 数据写入
//探测时钟
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if AnsiContainsStr(memo3.Text, '#') then //如果时钟探测到解析数据区收到'#'码,则表示数据接收完毕等待写入校验,并同时向发送端发送校验数据。
begin
edit5.Text:= GetStr(memo3.Text,'a1','b1') ;
edit6.Text:= GetStr(memo3.Text,'b1','c1') ;
edit7.Text:= GetStr(memo3.Text,'c1','d1') ;
edit8.Text:= GetStr(memo3.Text,'d1','#') ;
Button7.Click;
Timer1.Enabled:=false;
Button4.Click;
end;
if AnsiContainsStr(memo3.Text, '@') then //如果时钟探测到解析数据区收到'@'码,则表示发送端校验数据成功通过,可以向表中写入记录。
begin
ADOTable1.Insert;
ADOTable1.FieldByName('name').AsString:=edit5.Text;
ADOTable1.FieldByName('code').AsString:=edit6.Text;
ADOTable1.FieldByName('mz').AsString:=edit7.Text;
ADOTable1.FieldByName('dj').AsString:=edit8.Text;
ADOTable1.Post;
DBGrid1.Refresh;
Timer1.Enabled:=false;
Button4.Click;
end;
end;
3 数据界定
//指定获取数据界限的函数
function GetStr(StrSource,StrBegin,StrEnd:string):string;
var
in_star,in_end:integer;
begin
in_star:=AnsiPos(strbegin,strsource)+length(strbegin);
in_end:=AnsiPos(strend,strsource);
result:=copy(strsource,in_star,in_end-in_star);
end;
4. 信息加密设计
采用美国国防部军方的MD5加密设计,对重要财务敏感信息加密发送。使用MD5加密先定义变量并作以下单元引用声明:
var
Form1: TForm1;
md5 : TIdHashMessageDigest5;
longWordRec : T4x4LongWordRecord;
//对文本信息进行MD5加密
procedure TForm1.Button2Click(Sender: TObject);
begin
md5 := TIdHashMessageDigest5.Create;
longWordRec:=md5.HashValue(memo1.Text);
edit3.Text:= md5.AsHex(longWordRec) ;
end;
5. 测初始化设计
初始化设计包括:搜索可用的SQL服务器,建立连接,串口设置等。
//启动SQL数据库服务器并对接相应的表。
procedure TForm1.Button3Click(Sender: TObject);
begin
ADOConnection1.Connected:=false;
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test;Data Source='+ComboBox1.Text+'';
ADOConnection1.Connected:=true;
ADOConnection1.KeepConnection:=true;
ADOTable1.TableName:='Testtable';
ADOTable1.active:=true;
DBGridAutoSize(DBGrid1);
end;
//程序运行时搜索网内可以用的SQL服务器
procedure TForm1.FormShow(Sender: TObject);
var
I:integer;
x,y:oleVariant;
begin
x := CreateOleObject('SQLDMO.Application');
y := x.ListAvailableSQLServers;
ComboBox1.Clear;
for I := 1 to y.Count do
begin
ComboBox1.Items.Add(y.item(I))
end
end;
//启动程序时自动读取system.ini配置文件,设定串口通讯参数。
;-----------------------------------------------------
;无线传输通讯设置
;----------------------------------------------------
[COMM1]
ComPort=COM5---------------------打开串口5作为通讯端口
BaudRate=2400---------------------设置波特率2400
Parity=None---------------------校验位为空
DataBits=8---------------------数据位8
StopBits=1---------------------停止位1
6. 测试程序界面
6. 系统测试
· 数传设备:KYL-320I型无线数传模块
· 传输距离:5km(有工厂厂房阻挡及电磁干扰环境)
· 平均传输速度:3秒/每条数据
· 断电续传:有
· 正确率:100%
· 校验:MD5加密算法校验
7. 结论
笔者通过以上设计工作成功实现了最远5km数据传输距离,为基于两地的不同数据库之间数据的传输提供了一种新的解决方案。
近期已有不少学校发布了2025年硕士研究生招生简章及专业目录。特别提醒:大家要注意自己报考的目标院校及学院官网的最新通知,同时与往年招生专业目录对比,注意有变化及时作出调整。来看下面这些院校中有没有你的目标院校吧!北京135700设计中国人民大学清华大学北京交通大学北京工业大学北京理工大学北京工商...
本报讯(记者 褚鹏)世界女排联赛昨天结束了宁波北仑站的全部比赛。中国女排昨天继续演练新阵容,在与韩国女排的比赛中连丢三局(15比25、15比25和13比25)不敌对手,遭遇北仑站首场失利。不过尽管输掉了一场比赛,却并未影响中国队获得本站赛事的冠军,但中国队三局比分未能超过15分也着实让人大跌眼镜。...