1. 程式人生 > >如何用Delphi開發串列埠通訊程式

如何用Delphi開發串列埠通訊程式

       Delphi 是新一代視覺化開發工具,它具有功能強大、簡便易用和程式碼執行速度快等特點,Delphi系列開發工具在國際各媒體上曾獲得過三十多項大獎,是全球公認的快速應用開發工具技術的先驅者,他越來越在構架企業資訊系統方面發揮著重要作用。
它的功能很強大,但在對串列埠通訊的控制上Delphi的幫助文件和其他書籍中很少提及,可這是在開發應用系統時會經常遇到卻又令人頭痛的事情。下面介紹三種解決方案,以實現接收和傳送資料的功能。

     一、 使用ActiveX控制元件
由於Delphi中沒有串列埠控制元件可用,所以首先需要把ActiveX控制元件MSCOMM加到元件選項板上。這是一個非常好的控制元件它不僅能對串列埠進行操作,而且還可以對Modem進行控制。下面結合一個具體的例項來說明如何用MSCOMM控制元件開發出串列埠通訊程式。
建立一個Communication.dpr工程,把窗體的Name屬性變為CommForm,將標題改為The Communication Test,選擇File/Save As將新的窗體儲存為CommFrm.pas,接下來參照圖1和圖2將控制元件新增到主窗體中。

圖1 圖2
由圖1和圖2我們可以看出,通過設定頁可選定進行資料傳輸的通訊埠和埠的波特率、奇偶校驗、資料位和停止位,通訊時每傳輸一個字元都將觸發響應事件,在通訊頁“傳輸顯示”位置可看到當前正在進行傳輸的資料。同時當出現回車換行符時將整行內容顯示在memDisplay新的一行中,而全部接收的內容還將存在一個檔案中。部分原始碼如下:
變數說明
var
CommForm: TCommForm;
ss :string;
savef,readf :file of char;
i,j :longint;

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

設定確定
procedure TCommForm.btnConfirmClick(Sender: TObject);
begin
if mscomm.portopen then
mscomm.portopen:=false;
mscomm.commport:=strtoint(edtCommport.text);
mscomm.settings:=edtCommsetting.Text;
end;

傳輸事件
procedure TCommForm.MSCommComm(Sender: TObject);
var
filenrc :char;
buffer :variant;
s1:string;
c :char;
begin
case mscomm.commEvent of
comEvSend:
begin
while not(eof(readf)) do
begin
read(readf,filenrc);
mscomm.output:=filenrc;
j:=j+1;
lblDisplay.caption:=inttostr(j);
if mscomm.outbuffercount>=2 then
break;
end;
end;
comEvReceive:
begin
buffer:=mscomm.Input;
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;

當然還有許多串列埠控制的ActiveX控制元件,有控制元件用是方便,但是是否說沒有控制元件就不能用Delphi本身解決問題呢。那麼就請來看一下下面的解決方案:

      二、使用行間彙編
對於硬體的控制,組合語言是最方便的了,而Delphi中又允許使用行間彙編那麼來看一下怎樣使用行間彙編接收下位機傳來的資料,在下面的例子中我們簡化了問題,比如我們通過COM2接收400個傳來的字元並將這些內容儲存在AAA.DAT檔案中當接收完畢後顯示‘Receive end’。但是為什麼說我們簡化了問題呢,因為實際情況中雙方通訊可能是約定傳送字元的個數,也可能約定的是規定好的起始字元和結束字元,或是多種條件同時約定待各種條件全部滿足時才表示完成一次成功的接收否則如有一個條件未滿足都表示接收失敗需要重新傳送。這些約定在使用了行間彙編的Delphi程式中都可實現。下面的程式就是按一個按鈕進入的一個簡化的串列埠接收程式。
procedure TForm1.Button1Click(Sender: TObject);
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;
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呼叫可執行應用程式
採用其它程式設計技術編制的串列埠通訊程式在完成資料傳輸後將資料儲存到磁碟上,然後用Delphi對資料內容進行處理。通過在Delphi中與其他程式設計技術協同工作也不失為一種解決問題的好方法。