機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
Delphi 中串口通訊的實(shí)現(xiàn)
Delphi 中串口通訊的實(shí)現(xiàn)
 更新時(shí)間:2010-1-16 15:10:40  點(diǎn)擊數(shù):0
【字體: 字體顏色

Delphi 是新一代可視化開發(fā)工具,它具有功能強(qiáng)大、簡(jiǎn)便易用和代碼執(zhí)行速度快等特點(diǎn),是全球公認(rèn)的快速應(yīng)用開發(fā)工具技術(shù)的先驅(qū)者,它越來越在構(gòu)架企業(yè)信息系統(tǒng)方面發(fā)揮著重要作用。由于Delphi 這些顯著特點(diǎn),許多程序員選擇Delphi作為開發(fā)工具編制各種應(yīng)用程序。但是,令人惋惜的是Delphi沒有自帶串口通訊的控件,在它的幫助文檔里也沒有提及串口通訊,這就給編制通訊程序的開發(fā)人員帶來眾多麻煩,影響了開發(fā)進(jìn)度,下面就這一技術(shù)進(jìn)行討論。

  用Delphi 實(shí)現(xiàn)串口通訊,常用的幾種方法為:使用控件如MSCOMM和SPCOMM,使用API函數(shù)或者在Delphi 中調(diào)用其它串口通訊程序。利用API編寫串口通信程序較為復(fù)雜,需要掌握大量通信知識(shí),其優(yōu)點(diǎn)是可實(shí)現(xiàn)的功能更強(qiáng)大,應(yīng)用面更廣泛,更適合于編寫較為復(fù)雜的低層次通信程序。相比較而言,利用SPComm控件則相對(duì)較簡(jiǎn)單,該控件具有豐富的與串口通信密切相關(guān)的屬性及事件,提供了對(duì)串口的各種操作。

  使用控件這一方法容易掌握,而SPCOMM支持多線程,所以SPCOMM控件的應(yīng)用更加廣泛。結(jié)合實(shí)例詳細(xì)介紹SPCOMM的使用。

一.SPCOMM控件的安裝

1.選擇下拉菜單Component的第二項(xiàng)Install Component 。


  彈出圖1所示的窗口,在Unit file name 處填寫控件SPCOMM控件所在路徑,其它可用默認(rèn)值,點(diǎn)擊OK按紐。

2.安裝成功后,system控件面板中將出現(xiàn)一個(gè)紅色控件COMM,F(xiàn)在使用COMM控件可以象Delphi自帶控件一樣使用。


二.SPCOMM的主要屬性,方法和事件

1.屬性

CommName:填寫COM1,COM2…等串口的名字,在打開串口前,必須填寫好此值。 

BaudRate:設(shè)定波特率9600,4800等,根據(jù)實(shí)際需要來定,在串口打開后也可更改波特率,實(shí)際波特率隨之更改。

ParityCheck:奇偶校驗(yàn)。

ByteSize:字節(jié)長(zhǎng)度_5,_6,_7,_8等,根據(jù)實(shí)際情況設(shè)定。

Parity:奇偶校驗(yàn)位

pBits:停止位

SendDataEmpty:這是一個(gè)布爾屬性,為true時(shí)表示發(fā)送緩存為空,或者發(fā)送隊(duì)列里沒有信息;為False時(shí)表示表示發(fā)送緩存不為空,或者發(fā)送隊(duì)列里有信息。

2.方法 

  Startcomm過程用于打開串口,當(dāng)打開失敗時(shí)通常會(huì)報(bào)錯(cuò),錯(cuò)誤主要有7種:
⑴串口已經(jīng)打開 ;
⑵打開串口錯(cuò)誤 ;
⑶文件句柄不是通訊句柄; 
⑷不能夠安裝通訊緩存; 
⑸不能產(chǎn)生事件 ;
⑹不能產(chǎn)生讀進(jìn)程;
⑺不能產(chǎn)生寫進(jìn)程;

  StopComm過程用于關(guān)閉串口,沒有返回值。

  函數(shù)WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于發(fā)送一個(gè)字符串到寫線程,發(fā)送成功返回true,發(fā)送失敗返回false, 執(zhí)行此函數(shù)將立即得到返回值,發(fā)送操作隨后執(zhí)行。函數(shù)有兩個(gè)參數(shù),其中 pdatatowrite是要發(fā)送的字符串,dwsizeofdatatowrite 是發(fā)送的長(zhǎng)度。 

3.事件

OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 
  當(dāng)輸入緩存有數(shù)據(jù)時(shí)將觸發(fā)該事件,在這里可以對(duì)從串口收到的數(shù)據(jù)進(jìn)行處理。Buffer中是收到的數(shù)據(jù),bufferlength是收到的數(shù)據(jù)長(zhǎng)度。 

OnReceiveError : procedure(Sender: TObject; EventMask : DWORD) 
  當(dāng)接受數(shù)據(jù)時(shí)出現(xiàn)錯(cuò)誤將觸發(fā)該事件。

三.SPCOMM的使用

  下面,我們結(jié)合一個(gè)串口通訊的例子來說明SPCOMM的使用。

  為了實(shí)現(xiàn)PC與單片機(jī)8051之間的通訊,首先要調(diào)通它們之間的握手信號(hào),假定它們之間的通訊協(xié)議是,PC到8051一幀數(shù)據(jù)6個(gè)字節(jié),8051到PC一幀數(shù)據(jù)也為6個(gè)字節(jié),當(dāng)PC發(fā)出(F0,01,FF,FF,01,F0)后能收到這樣一幀(F0,01,FF,FF,01,F0),表示數(shù)據(jù)通信握手成功,兩者之間就可以按照協(xié)議相互傳輸數(shù)據(jù)。在PC方要發(fā)送及接受數(shù)據(jù)需要以下步驟:

1.創(chuàng)建一個(gè)新的工程COMM.DPR,把窗體的NAME屬性改為FCOMM,把窗體的標(biāo)題改為測(cè)試通訊,添加控件。

  對(duì)COMM1(黑色矩形圍住的控件)進(jìn)行屬性設(shè)計(jì),設(shè)波特率4800,校驗(yàn)位無,字節(jié)長(zhǎng)度_8,停止位_1,串口選擇COM1。Memo1中將顯示發(fā)送和接受的數(shù)據(jù)。選擇File/Save As將新的窗體存儲(chǔ)為Comm.pas。

2.編寫源代碼

變量說明

var

FCOMM: TFCOMM;

Viewstring:string;

i:integer;

rbuf,sbuf:array[1..6] of byte;

打開串口

procedure TFCOMM.FormShow(Sender: TObject);

begin

comm1.StartComm;

end;

關(guān)閉串口

procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);

begin

comm1.StopComm;

end;

發(fā)送數(shù)據(jù)

自定義的發(fā)送過程

procedure senddata;

var

i:integer;

commflg:boolean;

begin

viewstring:="";

commflg:=true;

for i:=1 to 6 do

begin

if not fcomm.comm1.writecommdata(@sbuf[i],1) then

begin

commflg:=false;

break;

end;

sleep(2); {發(fā)送時(shí)字節(jié)間的延時(shí)}

viewstring:=viewstring+inttohex(sbuf[i],2)+" ";

end;

viewstring:="發(fā)送"+viewstring;

fcomm.memo1.lines.add(viewstring);

fcomm.memo1.lines.add("");

if not commflg then messagedlg("發(fā)送失敗!",mterror,[mbyes],0);

end;

 

procedure TFCOMM.Btn_sendClick(Sender: TObject);{發(fā)送按鈕的點(diǎn)擊事件}

begin

sbuf[1]:=byte($f0); {幀頭}

sbuf[2]:=byte($01); {命令號(hào)}

sbuf[3]:=byte($ff);

sbuf[4]:=byte($ff);

sbuf[5]:=byte($01);

sbuf[6]:=byte($0f); {幀尾}

senddata;{調(diào)用發(fā)送函數(shù)}

end;

接收過程

procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;

BufferLength: Word);

var

i:integer;

begin

viewstring:="";

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

for i:=1 to bufferlength do

viewstring:=viewstring+inttohex(rbuf[i],2)+" ";

viewstring:="接受"+viewstring;

memo1.lines.add(viewstring);

memo1.lines.add("");

end;

  如果memo1上顯示發(fā)送F0 01 FF FF 0F 和 接受F0 01 FF FF F0

這表示串口已正確的發(fā)送出數(shù)據(jù)并正確的接受到數(shù)據(jù),串口通訊成功

 

  • 上一篇: 用單片機(jī)實(shí)現(xiàn)溫度遠(yuǎn)程顯示
  • 下一篇: 沒有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1