?? 新建 文本文檔.txt
字號:
用DELPHI開發(fā)串口通信軟件
用Delphi開發(fā)串口通信軟件一般有兩種方法:一是利用Windows的通信API函數(shù),另一種是采用Microsoft的MSComm控件。利用API編寫串口通信程序較為復(fù)雜,需要掌握大量通信知識,其優(yōu)點(diǎn)是實(shí)現(xiàn)的功能強(qiáng)大,應(yīng)用面廣泛,適合于編寫較為復(fù)雜的低層次通信程序。而利用MSComm控件則相對較簡單,該控件具有豐富的與串口通信密切相關(guān)的屬性及事件,提供了對串口的各種操作。
一、MSComm控件的主要屬性及事件
(1)CommPort:設(shè)置或返回串行端口號,缺省值1。
(2)Setting:設(shè)置或返回串口通信參數(shù),格式為“波特率,奇偶校驗(yàn)位,數(shù)據(jù)位,停止位”。例如:MSComm1.Setting:=′9600,n,8,1′
(3)PortOpen:打開或關(guān)閉串行端口,格式為:MSComm1.PortOpen:={True|False}
(4)InBufferSize:設(shè)置或返回接收緩沖區(qū)的大小,缺省值為1024字節(jié)。
(5)InBufferCount:返回接收緩沖區(qū)內(nèi)等待讀取的字節(jié)數(shù),可通過設(shè)置該屬性為0來清空接收緩沖區(qū)。
(6)RThreshold:該屬性為一閥值,它確定當(dāng)接收緩沖區(qū)內(nèi)的字節(jié)個數(shù)達(dá)到或超過該值后就產(chǎn)生代碼為ComEvReceive的OnComm事件。
(7)SThreshold:該屬性為一閥值,它確定當(dāng)發(fā)送緩沖區(qū)內(nèi)的字節(jié)個數(shù)少于該值后就產(chǎn)生代碼為ComEvSend的OnComm事件。
(8)InputLen:設(shè)置或返回接收緩沖區(qū)內(nèi)用Input讀入的字節(jié)數(shù),設(shè)置該屬性為0表示Input讀取整個緩沖區(qū)的內(nèi)容。
(9)Input:從接收緩沖區(qū)讀取一串字符。
(10)OutBufferSize:設(shè)置或返回發(fā)送緩沖區(qū)的大小,缺省值為512字節(jié)。
(11)OutBufferCount:返回發(fā)送緩沖區(qū)內(nèi)等待發(fā)送的字節(jié)數(shù),可通過設(shè)置該屬性為0來清空緩沖區(qū)。
(12)OutPut:向發(fā)送緩沖區(qū)傳送一串字符。
如果在通信過程中發(fā)生錯誤或事件,就會觸發(fā)OnComm事件,并由CommEvent屬性代碼反映錯誤類型,在通信程序的設(shè)計中可根據(jù)該屬性值來執(zhí)行不同的操作。CommEvent屬性值及其含義如下:
(1)ComEvSend:值為1,發(fā)送緩沖區(qū)的內(nèi)容少于SThreshold指定的值。
(2)ComEvReceive:值為2,接收緩沖區(qū)內(nèi)字符數(shù)達(dá)到RThreshold指定的值。
(3)ComEvFrame:值為1004,硬件檢測到幀錯誤。
(4)ComEvRxOver:值為1008,接收緩沖區(qū)溢出。
(5)ComEvTxFull:值為1010,發(fā)送緩沖區(qū)溢出。
(6)ComEvRxParity:值為1009,奇偶校驗(yàn)錯誤。
(7)ComEvEOF:值為7,接收數(shù)據(jù)中出現(xiàn)文件尾(ASCII碼為26)字符。
二、程序樣例
在Delphi3.0中無法使用MSComm控件,筆者使用的是Delphi5.0。MSComm控件是VB中的OCX控件,首先需要將其添加到Delphi中,選擇菜單“Component”→“Import ActiveX Control”,在“Import ActiveX”頁內(nèi)選擇“Microsoft Comm Control”,點(diǎn)擊“Install”安裝,安裝后在“ActiveX”組件板中出現(xiàn)MSComm圖標(biāo),即可被使用。有一點(diǎn)要注意,在Object Inspector中MSComm控件的Input和Output屬性是不可見的,但它們?nèi)匀淮嬖冢@兩個屬性的類型是OleVariant(Ole萬能變量)。
下面是一接收程序的樣例(主要部分),大家可根據(jù)實(shí)際需要進(jìn)行完善。
在Form中放置一Memo控件用于顯示接收的數(shù)據(jù),Combobox1選擇通信參數(shù)(Setting屬性值),Combobox2選擇串口(CommPort屬性值),按Button1開始接收數(shù)據(jù),按Button2停止接收。
procedure TForm1.FormCreate(Sender: TObject);
begin
Mscomm1.InBufferCount :=0; // 清空接收緩沖區(qū)
Mscomm1.InputLen :=0; // Input讀取整個緩沖區(qū)內(nèi)容
Mscomm1.RThreshold :=1; // 每次接收到字符即產(chǎn)生OnComm事件
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Mscomm1.Settings :=ComboBox1.Text;
if ComboBox2.Text =′com1′ then // 假設(shè)只考慮COM1和COM2兩種情況
Mscomm1.CommPort :=1
else
Mscomm1.CommPort :=2;
Mscomm1.PortOpen :=true; // 打開串口
Mscomm1.DTREnable :=true; // 數(shù)據(jù)終端準(zhǔn)備好
Mscomm1.RTSEnable :=true; // 請求發(fā)送
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Mscomm1.PortOpen :=false; // 關(guān)閉串口
Mscomm1.DTREnable :=false;
Mscomm1.RTSEnable :=false;
end;
procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;
begin
if Mscomm1.CommEvent = 2 then
begin
recstr := Mscomm1.Input ;
Memo1.text := Memo1.Text + recstr;
end;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -