delphi--串口数据发送与接收--电表数据采集
//spcomm数据发送函数
procedure TForm1.SendHex(S: String); //spcomm发送字符串s
var
s2:string;
buf1:array[0..1000] of char;
i:integer;
begin
s2:='';
for i:=1 to length(s) do //滤去16进制外的字符
begin
if ((copy(s,i,1)>='0') and (copy(s,i,1)
or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then
begin
s2:=s2+copy(s,i,1);
end;
end;
for i:=0 to (length(s2) div 2-1) do
buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2))); //字符串s存入数组并发送
Comm1.WriteCommData(buf1,(length(s2) div 2));
end;
//spcomm数据发送函数
procedure TForm1.SendHex(S: String); //spcomm发送字符串s
var
s2:string;
buf1:array[0..1000] of char;
i:integer;
begin
s2:='';
for i:=1 to length(s) do //滤去16进制外的字符
begin
if ((copy(s,i,1)>='0') and (copy(s,i,1)
or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then
begin
s2:=s2+copy(s,i,1);
end;
end;
for i:=0 to (length(s2) div 2-1) do
buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2))); //字符串s存入数组并发送
Comm1.WriteCommData(buf1,(length(s2) div 2));
end;
//字符,16进制,10进制转换函数说明
//var s,s3:integer;
// s1,s2:string;
// s4:real;
// s1:='3465ef';
// s:=strtoint('$'+(copy(s1,3,2)))-($33); //10进制50
// s2:=inttohex(s,2); //16进制32
// s3:=strtoint(s2); //10进制32
// s4:=0.12; //32*0.12
// showmessage(floattostr(s4));
//字符串可当数组使用
var s,a:string;
begin
s:='123456789123456789';
a:=s[2]+s[3]+s[3]+s[9];
showmessage(a); //得到2339
end;
//97规约数据接收并处理函数-得到正确数据
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i: DWORD;
rstr:string;
prstr:pointer;
num:real;
num1,num2,num3,num4:integer;
num11,num21,num31,num41:string;
num12,num22,num32,num42:integer;
pelecstr:pointer;
elecStr1,elecStr2,elecStr3,elecStr4:string;
begin
//取完整接收数据
prstr:=buffer;
for i:=0 to BufferLength-1 do
begin
rstr:=rstr+IntToHex(Byte(Pointer(Integer(prstr)+i)^),2);
end;
Memo2.Lines.Add(rstr);
//取电量数据 方法一BYTE-->REAL
pelecstr:=buffer; //97规约数据域指针从12开始
elecstr1:=IntToHex(Byte(Pointer(Integer(pelecstr)+12)^),2);
elecstr2:=IntToHex(Byte(Pointer(Integer(pelecstr)+13)^),2);
elecstr3:=IntToHex(Byte(Pointer(Integer(pelecstr)+14)^),2);
elecstr4:=IntToHex(Byte(Pointer(Integer(pelecstr)+15)^),2);
num1:=strtoint('$'+elecstr1)-($33);
num2:=strtoint('$'+elecstr2)-($33);
num3:=strtoint('$'+elecstr3)-($33);
num4:=strtoint('$'+elecstr4)-($33); //16进制字符串结果
num11:=inttohex(num1,2);
num21:=inttohex(num2,2);
num31:=inttohex(num3,2);
num41:=inttohex(num4,2);
showmessage(num41+num31+num21+num11); //10进制结果
num12:=strtoint(num11);
num22:=strtoint(num21);
num32:=strtoint(num31);
num42:=strtoint(num41);
num:=num12*0.01+num22*1+num32*100+num42*10000;
showmessage(floattostr(num));
end;
//delay函数,隔数秒采集一个数据,防止干扰
procedure Delay(dwMilliseconds:DWORD);//Longint
var
iStart,iStop:DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages; // 让Application去处理消息队伍中的消息。
until (iStop - iStart) >= dwMilliseconds;
end;
//07规约 spcomm接收数据并处理,数据写入数据库
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i: DWORD;
rstr:string;
prstr:pointer;
address2:string;
pelecstr:pointer;
elecStr1,elecStr2,elecStr3,elecStr4:string;
num:real;
numstr:string;
num1,num2,num3,num4:integer;
num11,num21,num31,num41:string;
num12,num22,num32,num42:integer;
tdate:string;
indate:string;
begin
//取完整接收数据字符串
prstr:=buffer;
for i:=0 to BufferLength-1 do
begin
rstr:=rstr+IntToHex(Byte(Pointer(Integer(prstr)+i)^),2);
end;
showmessage(rstr);
memo2.lines.add('接收命令'+rstr);
//取地址
address2:=copy(rstr,13,2)+copy(rstr,11,2)+copy(rstr,9,2)+copy(rstr,7,2)+copy(rstr,5,2)+copy(rstr,3,2);
//取电量数据
pelecstr:=buffer;
elecstr1:=IntToHex(Byte(Pointer(Integer(pelecstr)+14)^),2);
elecstr2:=IntToHex(Byte(Pointer(Integer(pelecstr)+15)^),2);
elecstr3:=IntToHex(Byte(Pointer(Integer(pelecstr)+16)^),2);
elecstr4:=IntToHex(Byte(Pointer(Integer(pelecstr)+17)^),2);
num1:=strtoint('$'+elecstr1)-($33); //数组使用elecstr,num1,num11,num12
num2:=strtoint('$'+elecstr2)-($33);
num3:=strtoint('$'+elecstr3)-($33);
num4:=strtoint('$'+elecstr4)-($33);
num11:=inttohex(num1,2); //16进制字符串结果
num21:=inttohex(num2,2);
num31:=inttohex(num3,2);
num41:=inttohex(num4,2);
//showmessage(num41+num31+num21+num11);
num12:=strtoint(num11); //10进制结果
num22:=strtoint(num21);
num32:=strtoint(num31);
num42:=strtoint(num41);
num:=num12*0.01+num22*1+num32*100+num42*10000;
showmessage(floattostr(num));
//取系统时间
tdate:= DateTimeToStr(Date());
indate:=FormatDateTime('yyyy-mm-dd hh:mm:ss.zzz', Now());
//数据写入数据库
ADOQuery1.close;
ADOQuery1.SQL.Clear;
//单引号中两个单引号
//ADOQuery1.SQL.add('insert rmtlog values(''14'',''000000000003'',''503.36'',''2013-06-24'',''2013-06-25 00:08:00.000'')');
ADOQuery1.SQL.add('insert rmtlog(cno,uno,fig,tdate,indate) values(''14'','''+address2+''','''+numstr+''','''+tdate+''','''+indate+''')');
//adoquery1.SQL.Add(sqlStr); //添加新的SQL
ADOQuery1.ExecSQL;
showmessage('数据 '+numstr+' 写入成功');
memo3.lines.add('数据 '+numstr+' 写入成功');
end;
来源:https://blog.csdn.net/qwe24111/article/details/99576738
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.085922002792358 seconds