男女午夜激情_www.天堂av.com_亚洲综合小说区_亚洲欧美自拍视频_成年精品_久久www免费人成—看片_激情综合五月天_久久高潮视频_最新国产成人ab网站_国产精品卡一

機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發
培訓信息
贊助商
Delphi中用SPComm控件實現串口通訊編程(PC機串口編程)
Delphi中用SPComm控件實現串口通訊編程(PC機串口編程)
 更新時間:2008-7-27 14:01:41  點擊數:3
【字體: 字體顏色

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

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

  使用控件這一方法容易掌握,而SPCOMM支持多線程,所以SPCOMM控件的應用更加廣泛。結合實例詳細介紹SPCOMM的使用。

一.SPCOMM控件的安裝

1.選擇下拉菜單Component的第二項Install Component 。

0 onclick="javascript:window.open(this.src);" style="cursor:pointer;" onload="javascript:if(this.width>600)this.style.width='600px';" border="0" />0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" border=0>

圖1

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

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

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

1.屬性

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

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

ParityCheck:奇偶校驗。

ByteSize:字節長度_5,_6,_7,_8等,根據實際情況設定。

Parity:奇偶校驗位

pBits:停止位

SendDataEmpty:這是一個布爾屬性,為true時表示發送緩存為空,或者發送隊列里沒有信息;為False時表示表示發送緩存不為空,或者發送隊列里有信息。

2.方法 

  Startcomm過程用于打開串口,當打開失敗時通常會報錯,錯誤主要有7種:
⑴串口已經打開 ;
⑵打開串口錯誤 ;
⑶文件句柄不是通訊句柄; 
⑷不能夠安裝通訊緩存; 
⑸不能產生事件 ;
⑹不能產生讀進程;
⑺不能產生寫進程;

  StopComm過程用于關閉串口,沒有返回值。

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

3.事件

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

OnReceiveError : procedure(Sender: TObject; EventMask : DWORD) 
  當接受數據時出現錯誤將觸發該事件。

三.SPCOMM的使用

  下面,我們結合一個串口通訊的例子來說明SPCOMM的使用。

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

1.創建一個新的工程COMM.DPR,把窗體的NAME屬性改為FCOMM,把窗體的標題改為測試通訊,添加控件。

  對COMM1(黑色矩形圍住的控件)進行屬性設計,設波特率4800,校驗位無,字節長度_8,停止位_1,串口選擇COM1。Memo1中將顯示發送和接受的數據。選擇File/Save As將新的窗體存儲為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;

關閉串口

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

begin

comm1.StopComm;

end;

發送數據

自定義的發送過程

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); {發送時字節間的延時}

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

end;

viewstring:="發送"+viewstring;

fcomm.memo1.lines.add(viewstring);

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

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

end;



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

begin

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

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

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

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

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

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

senddata;{調用發送函數}

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上顯示發送F0 01 FF FF 0F 和 接受F0 01 FF FF F0

這表示串口已正確的發送出數據并正確的接受到數據,串口通訊成功。

  • 上一篇: RS-232-C 串口通訊詳解
  • 下一篇: Delphi 中串口通訊的實現
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

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

    主辦:杭州市高新區(濱江)機電一體化學會
    中國行業電子商務100強網站

    網站經營許可證:浙B2-20080178-1
    主站蜘蛛池模板: 阿拉善左旗| 荔波县| 台江县| 通海县| 普格县| 奇台县| 汶川县| 怀柔区| 西乌珠穆沁旗| 吴旗县| 大安市| 乐昌市| 邮箱| 雅江县| 琼海市| 郸城县| 高唐县| 长乐市| 静宁县| 米易县| 徐汇区| 磐石市| 巫山县| 吕梁市| 万州区| 赤峰市| 河西区| 铁岭县| 化州市| 米易县| 清丰县| 临沧市| 驻马店市| 凤庆县| 新邵县| 乌鲁木齐县| 板桥市| 茶陵县| 文昌市| 理塘县| 渝北区|