国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Del phi串口通信程序設(shè)計與實現(xiàn)

2012-08-08 12:48:30傅宏偉
電腦與電信 2012年8期
關(guān)鍵詞:發(fā)送數(shù)據(jù)字符串控件

傅宏偉

(安徽先河消防科技工程有限公司,安徽 合肥 230000)

1.Delphi中實現(xiàn)串口通信的方法

利用Delphi實現(xiàn)串口通信的常用的方法有3種:一是利用控件,如MSComm控件和Spcomm控件;二是使用API函數(shù);三是調(diào)用其它串口通信程序。使用API方法的優(yōu)點是比較適合于編寫較為復(fù)雜的低層次通信程序,但缺點是編寫串口通信程序較為復(fù)雜,需要掌握大量通信知識。相比較而言,利用Spcomm控件則相對較簡單,Spcomm是Small-Pig Team開發(fā)的一個第三方Delphi串口控件,Spcomm控件并不是DELPHI 7.0自帶的控件,需要自己到相關(guān)網(wǎng)站下載并安裝到相關(guān)目錄下,該控件具有豐富的與串口通信密切相關(guān)的屬性及事件,提供了對串口的各種操作,編程簡單、通用性強、可移植性好,而且還支持多線程,在Delphi軟件開發(fā)中已經(jīng)成為一個被廣泛應(yīng)用的串口通信開發(fā)控件。

1.1 使用Windows API函數(shù)

Windows環(huán)境下的串口編程與DOS環(huán)境下的串口編程有很大的不同。Windows環(huán)境下的串口編程的最大特征之一就是設(shè)備無關(guān)性,它通過設(shè)備驅(qū)動程序?qū)indows應(yīng)用程序與不同的外界設(shè)備隔離。Windows封裝了Windows的通信機制,這種方式稱為通信API,Windows程序員可以利用Windows通信API進行編程,不用直接對硬件操作。

WIN 32通信API基本上是一個串行端口API,不是很適合局域網(wǎng)(LAN)通信。它把串口操作(以及并口等)與文件操作統(tǒng)一起來,使用類似的操作來實現(xiàn)。

用Windows API函數(shù)實現(xiàn)串口通信的主要事件有:

(1)打開和關(guān)閉串口:分別是用CreatFile函數(shù)和Close Handle函數(shù)實現(xiàn)。

(2)串口配置和屬性設(shè)置:使用GetCommState()函數(shù)獲取串口當(dāng)前配置,使用SetCommState()從新分配串口資源的各個參數(shù)。在配置串口屬性時,應(yīng)該先了解串口設(shè)備的屬性。通過GetCommProperties()函數(shù)獲得串口的屬性。

(3)讀/寫串口:使用ReadFile()和WriteFile函數(shù)來實現(xiàn)。

(4)編寫相應(yīng)的OnClick事件的相關(guān)代碼。

1.2 使用MSComm控件

MSComm控件通過串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通訊功能。MSComm控件在串口編程時非常方便,程序員不必去花時間去了解較為復(fù)雜的API函數(shù),而且在VC、VB、Delphi等語言中均可使用。

(1)MSComm控件兩種處理通訊的方式

MSComm控件提供下列兩種處理通訊的方式:事件驅(qū)動方式和查詢方式。

(2)MSComm控件的常用屬性

CommPort:設(shè)置并返回通訊端口號;

Settings:以字符串的形式設(shè)置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位;

PortOpen:設(shè)置并返回通訊端口的狀態(tài)。也可以打開和關(guān)閉端口;

Input:從接收緩沖區(qū)返回和刪除字符;

Output:向傳輸緩沖區(qū)寫一個字符串;

EOFEnable:確定在輸入過程中MSComm控件是否尋找文件結(jié)尾(EOF)字符。如果找到EOF字符,將停止輸入并激活OnComm事件,此時CommEvent屬性設(shè)置為comEvEOF。

MSComm控件的事件只有一個,就是OnComm事件。

(3)使用MSComm控件實現(xiàn)串口通信的基本流程:

1)添加MSComm控件

2)初始化并打開串口

3)捕捉串口事件

4)串口讀寫

5)關(guān)閉串口

1.3 使用Spcomm控件

Spcomm控件并不是Delphi 7.0自帶的控件,需要自己到相關(guān)網(wǎng)站下載并安裝到相關(guān)目錄下。利用Spcomm控件就可以實現(xiàn)串口通信,因為該控件具有豐富的與串口通信密切相關(guān)的屬性及事件,提供了對串口的各種操作,而且還支持多線程,能實現(xiàn)一般的串口通信需要。

Spcomm的安裝:

(1)選擇下拉菜單Component中的Install Component選項,在Unit file name處填寫Spcomm控件所在的路徑,其它各項可用默認值,點擊OK按鈕。

(2)安裝后,在System控件面板中將出現(xiàn)一個紅色控件Com。

Spcomm的屬性、方法和事件:

(1)屬性

CommName:表示Com1、Com2等串口的名字;

BaudRate:根據(jù)實際需要設(shè)定的波特率,在串口打開后也可更改此值,實際波特率隨之更改;

ParityCheck:表示是否需要奇偶校驗;

ByteSize:根據(jù)實際情況設(shè)定的字節(jié)長度;

Parity:奇偶校驗位;

StopBits:停止位;

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

(2)方法

StartComm方法用于打開串口,當(dāng)打開失敗時通常會報錯。錯誤主要有7種:串口已經(jīng)打開;打開串口錯誤;文件句柄不是通信句柄;不能夠安裝通信緩存;不能產(chǎn)生事件;不能產(chǎn)生讀進程;不能產(chǎn)生寫進程。

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

WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word)方法是個帶有布爾型返回值的函數(shù),用于將一個字符串發(fā)送到寫進程,發(fā)送成功返回true,發(fā)送失敗返回false。執(zhí)行此函數(shù)將立即得到返回值,發(fā)送操作隨后執(zhí)行。該函數(shù)有兩個參數(shù),其中pDataToWrite是要發(fā)送的字符串,dwSizeofDataToWrite是發(fā)送字符串的長度。

(3)事件

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

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

在使用Spcomm控件的時候,首先要添加一個Com控件,之后設(shè)定Com1屬性,再設(shè)置Com控件的發(fā)送和接受的觸發(fā)事件,最后編寫源代碼并進行調(diào)試。

(4)Spcomm串口通信的實現(xiàn)

Spcomm串行通信控件具有多線程的特性,接收和發(fā)送數(shù)據(jù)分別在兩個線程內(nèi)完成,接收線程負責(zé)收到數(shù)據(jù)時觸發(fā)OnReceiveData事件;用WriteCommData()函數(shù)將待發(fā)送的數(shù)據(jù)寫入輸出緩沖器,發(fā)送線程在后臺完成數(shù)據(jù)發(fā)送工作。在接收和發(fā)送數(shù)據(jù)前需要初始化串口,用StartComm方法打開串口,退出程序時用StopComm方法關(guān)閉串口。

1.4 調(diào)用其它串口通信程序

除了使用Windows API函數(shù)、MSCOMM控件、Spcomm控件實現(xiàn)串口通信,還可以使用CommPortDrv控件、SerialPort控件等。除了通用的串口通信控件,還有一些專用的串行通信控件用于處理特定的設(shè)備模塊,例如TGPS控件就是專門處理GPS接受機串行通信輸出的NMEA-0183格式的數(shù)據(jù),分析得到定位信息等。這些通信控件一般都極大地簡化了對底層的設(shè)置,提供了許多強大的功能,可以加快程序的開發(fā)過程。

2.系統(tǒng)設(shè)計與實現(xiàn)

2.1 發(fā)送窗口功能實現(xiàn)

圖1 發(fā)送窗口界面

代碼實現(xiàn):

保存數(shù)據(jù)功能代碼如下:

2.2 實時數(shù)據(jù)發(fā)送功能實現(xiàn)

圖2 實現(xiàn)實時數(shù)據(jù)發(fā)送界面

設(shè)計的關(guān)鍵是使用Spcomm控件和Timer控件實現(xiàn)。

(1)初始化

需要選擇本次通信使用的串口,設(shè)置波特率、校驗方式、數(shù)據(jù)位、停止位等屬性,打開該串口。示例代碼如下:

這與具體實現(xiàn)的PC機有關(guān),在設(shè)置軟件Com口屬性前應(yīng)該先查看好該機器的Com屬性,使得二者能匹配,這樣能避免在用模擬軟件實現(xiàn)實時數(shù)據(jù)發(fā)送時出現(xiàn)錯誤。

(2)發(fā)送測試數(shù)據(jù)

實現(xiàn)模擬的實時數(shù)據(jù)采集,首先要調(diào)試串口,測試信號可以隨意選擇某特定字符串,通過發(fā)送測試信號實現(xiàn),當(dāng)PC發(fā)出這樣一些測試數(shù)據(jù)后,通過接收事件能收到特定的某字符串,則表示測試成功,串口發(fā)送數(shù)據(jù)可以正常進行。否則需重新發(fā)送測試信號。

以下為向計算機發(fā)送一個測試數(shù)據(jù):

代碼如下:

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

(4)關(guān)閉串口

(5)定時器設(shè)計

2.3 Spcomm串口通信的關(guān)鍵技術(shù)問題

首先,Spcomm是通過 ReadIntervalTimeout屬性的設(shè)置,來確定所接收到的數(shù)據(jù)是否屬于同一幀數(shù)據(jù),其默認值是100ms,也就是說,只要任何兩個字節(jié)到達的時間間隔小于100ms,都被認為是屬于同一幀數(shù)據(jù),在與單片機協(xié)同工作時,要特別注意這個問題。

另外,Spcomm的默認屬性設(shè)置是支持軟件流控制的,用于流控制的字符是13H(XoffChar)和11H(XonChar),當(dāng)以二進制方式發(fā)送數(shù)據(jù)時,必須要禁用Spcomm對于軟件流控制的支持,否則,在數(shù)據(jù)幀中出現(xiàn)的13H,11H會被Spcomm作為控制字符而加以忽略。

3.結(jié)束語

實踐證明,利用Spcomm串行通信控件在Delphi7.0中開發(fā)串口通信程序,具有靈活、方便、高效的特點。

[1]李軍.Delphi 7項目開發(fā)實踐[M].北京:中國鐵道出版社,2003.

[2]趙蘭濤蘇彥華.Delphi串口通信技術(shù)與工程實踐[M].北京:人民郵電出版社,2004.

[3]張宏林.Delphi 7程序設(shè)計與開發(fā)技術(shù)大全[M].北京:人民郵電出版社,2004.

[4]劉宗鍵.Delphi7程序設(shè)計入門[M].天津:天津電子出版社,2003.

[5]劉斌,李文革.Delphi 7高級教程[M].北京:清華大學(xué)出版社,2004.

[6]彭明明,程文剛.Delphi實用編程100例[M].北京:中國鐵道出版社,2004.

[7]楊長春.Delphi程序設(shè)計教程[M].北京:清華大學(xué)出版社,2005.

[8]康祥順.Delphi案例開發(fā)集錦[M].北京:電子工業(yè)出版社,2005.

[9]劉山,趙輝.Delphi系統(tǒng)開發(fā)實例精粹[M].北京:人民郵電出版社,2005.

猜你喜歡
發(fā)送數(shù)據(jù)字符串控件
移動自組網(wǎng)中MAC層協(xié)議研究
基于馬爾科夫鏈的LoRaWAN網(wǎng)絡(luò)節(jié)點性能分析
帶標記方式的CRDSA++協(xié)議性能分析*
關(guān)于.net控件數(shù)組的探討
軟件(2018年7期)2018-08-13 09:44:42
使用IPSec安全傳輸數(shù)據(jù)
一種新的基于對稱性的字符串相似性處理算法
依據(jù)字符串匹配的中文分詞模型研究
就這樣玩會VBA中常見的自定義控件
電腦迷(2012年24期)2012-04-29 00:44:03
一種針對Java中字符串的內(nèi)存管理方案
小改字符串讓殺毒軟件閉嘴
雅江县| 新兴县| 轮台县| 太原市| 托克逊县| 武清区| 固原市| 渝中区| 福州市| 兴宁市| 平泉县| 丹阳市| 孟州市| 五华县| 秦安县| 怀安县| 张家港市| 汶川县| 白朗县| 怀化市| 渑池县| 樟树市| 诸暨市| 富锦市| 大安市| 岐山县| 肥西县| 长阳| 黄梅县| 柳林县| 渭源县| 阳江市| 台南县| 永丰县| 双流县| 若尔盖县| 天镇县| 瑞金市| 茌平县| 梁山县| 开江县|