當(dāng)前位置:機(jī)電之家首頁(yè) >> PLC技術(shù)>> PLC基礎(chǔ) >> PLC通信 >> 如何用Delphi開(kāi)發(fā)串口通信程序
如何用Delphi開(kāi)發(fā)串口通信程序

龔建偉評(píng)論:本文對(duì)在Delphi中使用ActiveX控件,使用行間匯編,用Delphi調(diào)用可執(zhí)行應(yīng)用程序三種方法實(shí)現(xiàn)串口通信進(jìn)行了闡述。不過(guò)在Delphi中進(jìn)行串口編程并不象作者所說(shuō)的那樣令人頭疼,我就知道幾個(gè)很好用的串口程序是用Delphi編寫的(我不太會(huì)用Delphi)。

  Delphi 是新一代可視化開(kāi)發(fā)工具,它具有功能強(qiáng)大、簡(jiǎn)便易用和代碼執(zhí)行速度快等特點(diǎn),Delphi系列開(kāi)發(fā)工具在國(guó)際各媒體上曾獲得過(guò)三十多項(xiàng)大獎(jiǎng),是全球公認(rèn)的快速應(yīng)用開(kāi)發(fā)工具技術(shù)的先驅(qū)者,他越來(lái)越在構(gòu)架企業(yè)信息系統(tǒng)方面發(fā)揮著重要作用。
  它的功能很強(qiáng)大,但在對(duì)串口通信的控制上Delphi的幫助文檔和其他書(shū)籍中很少提及,可這是在開(kāi)發(fā)應(yīng)用系統(tǒng)時(shí)會(huì)經(jīng)常遇到卻又令人頭痛的事情。下面介紹三種解決方案,以實(shí)現(xiàn)接收和發(fā)送數(shù)據(jù)的功能。

一、 使用ActiveX控件
由于Delphi中沒(méi)有串口控件可用,所以首先需要把ActiveX控件MSCOMM加到元件選項(xiàng)板上。這是一個(gè)非常好的控件它不僅能對(duì)串口進(jìn)行操作,而且還可以對(duì)Modem進(jìn)行控制。下面結(jié)合一個(gè)具體的實(shí)例來(lái)說(shuō)明如何用MSCOMM控件開(kāi)發(fā)出串口通信程序。
創(chuàng)建一個(gè)Communication.dpr工程,把窗體的Name屬性變?yōu)镃ommbbbb,將標(biāo)題改為The Communication Test,選擇File/Save As將新的窗體存儲(chǔ)為CommFrm.pas,接下來(lái)將控件添加到主窗體中。
  通過(guò)設(shè)置頁(yè)可選定進(jìn)行數(shù)據(jù)傳輸?shù)耐ㄐ哦丝诤投丝诘牟ㄌ芈?、奇偶校?yàn)、數(shù)據(jù)位和停止位,通信時(shí)每傳輸一個(gè)字符都將觸發(fā)響應(yīng)事件,在通信頁(yè)“傳輸顯示”位置可看到當(dāng)前正在進(jìn)行傳輸?shù)臄?shù)據(jù)。同時(shí)當(dāng)出現(xiàn)回車換行符時(shí)將整行內(nèi)容顯示在memDisplay新的一行中,而全部接收的內(nèi)容還將存在一個(gè)文件中。部分源代碼如下:
變量說(shuō)明
var
Commbbbb: TCommbbbb;
ss :bbbbbb;
savef,readf :file of char;
i,j :longint;

初始化
procedure TCommbbbb.bbbbCreate(Sender: Tbbbbbb);
begin
mscomm.commport:=1;
mscomm.settings:='9600,n,8,1';
mscomm.bbbbblen:=1;
mscomm.inbuffercount:=0;
mscomm.portopen:=true;
ss:='';
i:=0;
j:=0;
assignfile(savef,'save1');
rewrite(savef);
assignfile(readf,'read1');
reset(readf);
end;

設(shè)置確定
procedure TCommbbbb.btnConfirmClick(Sender: Tbbbbbb);
begin
if mscomm.portopen then
mscomm.portopen:=false;
mscomm.commport:=strtoint(edtCommport.text);
mscomm.settings:=edtCommsetting.Text;
end;

傳輸事件
procedure TCommbbbb.MSCommComm(Sender: Tbbbbbb);
var
filenrc :char;
buffer :variant;
s1:bbbbbb;
c :char;
begin
case mscomm.commEvent of
comEvSend:
begin
while not(eof(readf)) do
begin
read(readf,filenrc);
mscomm.output:=filenrc;

[NextPage]
j:=j+1;
lblDisplay.caption:=inttostr(j);
if mscomm.outbuffercount>=2 then
break;
end;
end;
comEvReceive:
begin
buffer:=mscomm.bbbbb;
s1:=buffer;
c:=s1[1];
ss:=ss+c;
i:=i+1;
lblDisplay.caption:=c+inttostr(i);
write(savef,c);
if (c=chr(10))or(c=chr(13)) then
begin
lblDisplay.caption:='cr'+inttostr(i);
memDisplay.lines.add(ss);
ss:='';
end;
end;
end;
end;

當(dāng)然還有許多串口控制的ActiveX控件,有控件用是方便,但是是否說(shuō)沒(méi)有控件就不能用Delphi本身解決問(wèn)題呢。那么就請(qǐng)來(lái)看一下下面的解決方案:

二、使用行間匯編
對(duì)于硬件的控制,匯編語(yǔ)言是最方便的了,而Delphi中又允許使用行間匯編那么來(lái)看一下怎樣使用行間匯編接收下位機(jī)傳來(lái)的數(shù)據(jù),在下面的例子中我們簡(jiǎn)化了問(wèn)題,比如我們通過(guò)COM2接收400個(gè)傳來(lái)的字符并將這些內(nèi)容保存在AAA.DAT文件中當(dāng)接收完畢后顯示‘Receive end’。但是為什么說(shuō)我們簡(jiǎn)化了問(wèn)題呢,因?yàn)閷?shí)際情況中雙方通信可能是約定傳送字符的個(gè)數(shù),也可能約定的是規(guī)定好的起始字符和結(jié)束字符,或是多種條件同時(shí)約定待各種條件全部滿足時(shí)才表示完成一次成功的接收否則如有一個(gè)條件未滿足都表示接收失敗需要重新傳送。這些約定在使用了行間匯編的Delphi程序中都可實(shí)現(xiàn)。下面的程序就是按一個(gè)按鈕進(jìn)入的一個(gè)簡(jiǎn)化的串口接收程序。
procedure Tbbbb1.Button1Click(Sender: Tbbbbbb);
var ca:array[1..400]of char;
c:char;
i,j:integer;
f1:file of char;
label loop1;
begin
i:=1;
asm
mov dx,0001
mov ax,005eh
int 14h
end;

[NextPage]
for j:=1 to 400 do
begin
asm
loop1: mov dx,0001
mov ah,02
int 14h
test ah,80h
jnz loop1
mov c,al
end;
ca[i]:=c;
i:=i+1;
end;
assignfile(f1,'aaa.dat');
rewrite(f1);
for j:=1 to i-1 do
write(f1,ca[j]);
closefile(f1);
label1.caption:='receive end';
end;

三、用Delphi調(diào)用可執(zhí)行應(yīng)用程序
采用其它編程技術(shù)編制的串口通信程序在完成數(shù)據(jù)傳輸后將數(shù)據(jù)保存到磁盤上,然后用Delphi對(duì)數(shù)據(jù)內(nèi)容進(jìn)行處理。通過(guò)在Delphi中與其他編程技術(shù)協(xié)同工作也不失為一種解決問(wèn)題的好方法。

作者:未知 點(diǎn)擊:925次 [打印] [關(guān)閉] [返回頂部]
本文標(biāo)簽:如何用Delphi開(kāi)發(fā)串口通信程序
* 由于無(wú)法獲得聯(lián)系方式等原因,本網(wǎng)使用的文字及圖片的作品報(bào)酬未能及時(shí)支付,在此深表歉意,請(qǐng)《如何用Delphi開(kāi)發(fā)串口通信程序》相關(guān)權(quán)利人與機(jī)電之家網(wǎng)取得聯(lián)系。
電子樣本

SN系列樣冊(cè)
:鞏經(jīng)理
:13915946763
:南京塞姆泵業(yè)有限公司
個(gè)人求購(gòu)

 【求購(gòu)】  洗手池  2025-12-17
馮經(jīng)理 【求購(gòu)】  PTD電機(jī)  2025-12-17
倪先生 【求購(gòu)】  液壓馬達(dá)  2025-12-16
練子棟 【求購(gòu)】  金屬管件  2025-12-16
陳經(jīng)理 【求購(gòu)】  求購(gòu)螺母螺...  2025-12-16
Alyssa Yin(尹小姐) 【求購(gòu)】  SEEBA...  2025-12-15
曾經(jīng)理 【求購(gòu)】  定制酒店香...  2025-12-12
張瑜 【求購(gòu)】  防靜電橡膠...  2025-12-12
VIP公司推薦