delphi--串口数据发送与接收--电表数据采集  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi--串口数据发送与接收--电表数据采集


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