有关做串口数据采集编程常碰到的运算

   这段时间一直在做一些设备的数据采集,不同的设备采用的传输协议都不相同,但大同小议,基本上都是在一些数据类型和编码格式的不同间进行转换,所以在关这方面的类型转换对于开发串口数据采集的工作者来说是非常重要的,因此本人贴上自己所做的东西,希望对大家有参考价值:

//十六进制转十进制;

  edit1.Text:=inttostr($ff);

//十进制转ASII字符

  edit1.text:=char(48);

//十六进制转ASII字符[自己写的函数,当然还可以用更好的办法,此处方便大家的理解,其它方法也是一样的道理,只是更简洁]
function XL_zh(var ch:string):string;
begin
     if ch='30' then
     result:='0';
     if ch='31' then
     result:='1';
     if ch='32' then
     result:='2';
     if ch='33' then
     result:='3';
     if ch='34' then
     result:='4';
     if ch='35' then
     result:='5';
     if ch='36' then
     result:='6';
     if ch='37' then
     result:='7';
     if ch='38' then
     result:='8';
     if ch='39' then
     result:='9';
     if ch='41' then
     result:='A';
     if ch='42' then
     result:='B';
     if ch='43' then
     result:='C';
     if ch='44' then
     result:='D';
     if ch='45' then
     result:='E';
     if ch='46' then
     result:='F';
end;

//把ASII字符当成十六进制转十进制数[当然要在0-F范围内]

  by1:='41';

  by2:='42';

  edit1.Text:=inttostr(strtoint('$'+(XL_zh(by1))+(XL_zh(by2))));

//分割字符串[因为delphi中没有split函数,所以用以下这个,是delphi自带的]

  ExtractStrings([' '],[' '],pchar(PI[g2]),st);

  第一个参数是你要以怎么字符来分割;

  第二个参数是你要去除的字符;

  第三个参数是源字符串,由于这里是PCHAR类型,所以若你源字符是STRING的话就得这样做。

  第四个参数就是分割所得的字符存放的变量,为TSTRINGLIST类型。

//十进制转二进制[有关这个函数我在网上查了很多,都是出现第一位是0时丢失的情况,所以我自己写了这个]
function inttoBin(i: integer): string;
var
  s:string;
begin
  if i=0 then
    s:='0000';
  while i <>0 do
  begin         

   s:=inttostr((i mod 2))+s;
   i:=i div 2;
   if (i=0) and (length(s)<4) then
   s:='0'+s;
  end;
  result:=s;
end;

//求一个数的多少次方

delphi自带有power(A,B)函数,第一个为底数,第二个为次方数。

//把从缓存中读到的字节转换成相应的字符串

inttohex(rbuf[i],2);

对数组动态分配内存空间:

setlength(PI,g1);第一个参数为需要分配的数组,第二个为分配值。

//十进制转ASII字符

 char(65);

//求一个字符串的长度

length(memo1.Text);

//读取缓存数据[不同控件不一定相同,我这里是SPCOMM控件]

move(buffer^,PChar(@rbuf)^,bufferlength);

//写入设备[需要循环,直到发送完你的命令格式数据为止]

comm2.WriteCommData(@sbuf[i],1)

//延时[有时需要延时才不会出错]单位为MS级

sleep(200);

//格式化输出

formatfloat('0.0',XL);

//以下是本人针对DDSJ-308A型电导率仪器的采集所编的例子:

function XL(F:TA3B):Single;
var
   YM,J,V:single;
   i,k:integer;
   JM:Byte;
begin //计算尾数的十进制值
if(F[2] and $80)=$80 then
begin
    YM:=0.5;
    V:=0.5;
end
else
begin
    YM:=0;
    V:=1;
end;
  for k:=2 to 3 do //字节循环
   for i:=0 to 7 do //对每个字节里面的位循环
   begin
        V:=V/2;//在二进制中小数部分每降一位就意味着要除以2
        F[k]:=F[k]shl 1;//取出字节中的每一位来判断
        if(F[k] and $80)=$80 then //为1则加上此地的值
        YM:=YM+V; //最终尾数值
   end; //计算阶码的十进制值
   JM:=F[1] and $3F; //阶码的二进制值
   if(F[1] and $40)=$40 then //判断阶码是否为负数
   begin
        JM:=-JM;
   end;
   J:=power(2,JM); //以2为底的次方数的值
   Result:=YM*J; //最终值
   if(F[1] and $80)=$80 then //是否为负数
   Result:=-Result
end;

阅读更多

没有更多推荐了,返回首页