有關做串列埠資料採集程式設計常碰到的運算

2021-06-16 03:30:56 字數 3177 閱讀 6015

這段時間一直在做一些裝置的資料採集,不同的裝置採用的傳輸協議都不相同,但大同小議,基本上都是在一些資料型別和編碼格式的不同間進行轉換,所以在關這方面的型別轉換對於開發串列埠資料採集的工作者來說是非常重要的,因此本人貼上自己所做的東西,希望對大家有參考價值:

//十六進製制轉十進位制;

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;

vars: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;

varym,j,v:single;

i,k:integer;

jm:byte;

begin //計算尾數的十進位制值

if(f[2] and $80)=$80 then

begin

ym:=0.5;

v:=0.5;

endelse

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;

有關做串列埠資料採集程式設計常碰到的運算

十六進製制轉十進位制 edit1.text inttostr ff 十進位制轉asii字元 edit1.text char 48 十六進製制轉asii字元 自己寫的函式,當然還可以用更好的辦法,此處方便大家的理解,其它方法也是一樣的道理,只是更簡潔 function xl zh var ch str...

資料採集 實現串列埠資料的上傳

華清遠見教育集團 15年專注高階it培訓 做良心教育,做專業教育,做受人尊敬的職業教育 創客學院官網 底層實現對資料的採集 分類 打包 傳送,同時還要可以接收並解析上位機傳遞下來的命令。這意味不是僅僅採集到資料就ok了的,還要把資料表述成上位機想要的格式。這裡使用stm32f407的晶元實現的程式,...

用MFC編寫串列埠通訊,實現資料採集功能

硬體連線 工控機 rs232線 力感測器 pt600顯示儀表 rs232線將顯示儀表和工控機相連 程式設計預定功能 實現mfc所寫軟體介面中編輯框能夠實時顯示儀表所顯示的數值 3.第一步 將儀表的各項引數設定好,包括資料位 波特率 校驗位 停止位等,然後利用串列埠除錯助手,測試所連線的硬體通訊是否暢...