使用串口SPCOMM接收數(shù)據(jù)的時(shí)候0x11和0x13無(wú)法接受,從時(shí)間間隔上看來(lái)可以接收,但是無(wú)法顯示。網(wǎng)上查錯(cuò)誤得:
------------------------------------------------------------------------
OutX_XonXOffFlow/InX_XonXoffFlow:這個(gè)屬性是指進(jìn)行發(fā)送/接收時(shí)的軟件握手標(biāo)志,兩個(gè)握手信號(hào)之間的數(shù)據(jù)被認(rèn)為是通訊數(shù)據(jù),收到握手信號(hào)后,通訊就中止了。
FOutx_XonXoffFlow := True;
FInx_XonXoffFlow := True;
XOffChar/XOnChar:這是指握手的字節(jié),默認(rèn)的初始中,有
FXonChar := chr($11);
FXoffChar := chr($13);
至此,真相大白。0x11,0x13被占用為通訊握手信號(hào),自然不會(huì)得到正確的處理。
問(wèn)題找到了,解決也很容易。只需要在Comm的初始化中,自己定義
Comm.Inx_XonXoffFlow := False;
Comm.Outx_XonXoffFlow := False;
用Delphi 實(shí)現(xiàn)串口通信,常用的方法有:使用控件,如Mscomm和Spcomm控件等;使用API函數(shù);在Delphi 中調(diào)用其它串口通信程序。
使用API方法的優(yōu)點(diǎn)是比較適合于編寫(xiě)較為復(fù)雜的低層次通信程序,但缺點(diǎn)是編寫(xiě)串口通信程序較為復(fù)雜,需要掌握大量通信知識(shí)。
Spcomm是Small-Pig Team開(kāi)發(fā)的一個(gè)第三方Delphi串口控件,該控件具有豐富的與串口通信密切相關(guān)的屬性及事件,提供了對(duì)串口的各種操作,且編程簡(jiǎn)單、通用性強(qiáng)、可移植性好。在Delphi軟件開(kāi)發(fā)中已經(jīng)成為一個(gè)被廣泛應(yīng)用的串口通信開(kāi)發(fā)控件。
Spcomm共實(shí)現(xiàn)了三個(gè)類(lèi):串口類(lèi)Tcomm、讀線(xiàn)程類(lèi)TreadThread以及寫(xiě)線(xiàn)程類(lèi)TwziteThread[1]。Tcomm的某個(gè)實(shí)例在方法StartComm中打開(kāi)串口,并實(shí)例化了一個(gè)讀線(xiàn)程ReadThread和一個(gè)寫(xiě)線(xiàn)程WriteThread,它們和主線(xiàn)程之間進(jìn)行消息的傳遞,實(shí)現(xiàn)串口通信。
在Delphi7.0中安裝Spcomm串口通信控件的方法為:選擇Delphi7.0的“Component”菜單,點(diǎn)擊“Install Component...”菜單項(xiàng),然后在彈出的Into existing package屬性頁(yè)中Unit file name輸人框中選擇SPCOMM.pas文件,單擊兩次 “OK”按鈕后,就可以將Spcomm控件安裝到Delphi7.0的System組件頁(yè)上。
Spcomm串口通信控件的基本屬性、方法和事件說(shuō)明如下:
CommName屬性:計(jì)算機(jī)串口端口號(hào)的名字,COM1、COM2……等,在打開(kāi)串口前,必須填寫(xiě)好此值。
Parity屬性:校驗(yàn)位 None、Odd、Even、Mark、Space等。
BaudRate:設(shè)定支持串口通信用的波特率9600,4800等,根據(jù)實(shí)際需要來(lái)定,在串口打開(kāi)后也可更改波特率,實(shí)際波特率隨之更改。
ByteSize屬性:表示一個(gè)字節(jié)中,使用多少個(gè)數(shù)據(jù)位收發(fā)數(shù)據(jù),根據(jù)具體情況設(shè)定5、6、7、8等。
StopBits屬性:表示一個(gè)字節(jié)中,使用停止位的位數(shù),根據(jù)具體情況設(shè)定1、1.5、2等。
SendDataEmpty屬性:布爾屬性,為T(mén)rue時(shí)表示發(fā)送緩存為空,或者發(fā)送隊(duì)列里沒(méi)有信息;為False時(shí)表示表示發(fā)送緩存不為空,或者發(fā)送隊(duì)列里有信息。
StartComm方法:用來(lái)打開(kāi)通信串口,開(kāi)始通信。如果失敗,則會(huì)導(dǎo)致串行口錯(cuò)誤。錯(cuò)誤類(lèi)型大致分為串行口己處于打開(kāi)狀態(tài),所以不能打開(kāi)串行口,不能創(chuàng)建讀寫(xiě)進(jìn)程,不能建立串行口緩沖區(qū)等。
StopComm方法:用來(lái)停止通信串行口的所有進(jìn)程,關(guān)閉串口。
WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word)方法是帶有布爾型返回值的函數(shù),其中參量pszStr-ingToWrite是要寫(xiě)入串行口的字符串,DwSizeaf- DataToWrite是要寫(xiě)入的字符串的長(zhǎng)度。該函數(shù)通過(guò)一個(gè)寫(xiě)線(xiàn)程向串行口輸出緩沖區(qū)發(fā)送數(shù)據(jù)。發(fā)送操作將在后臺(tái)默認(rèn)執(zhí)行。如果寫(xiě)線(xiàn)程PostMessage成功,則返回值是True,若寫(xiě)線(xiàn)程失敗,返回值是False。
OnReceiveData(Buffer:Pointer;BufferLength:Word),其中Buffer是指向輸入緩沖區(qū)的指針。BufferLength是從緩沖區(qū)收到的數(shù)據(jù)長(zhǎng)度。當(dāng)輸入緩沖區(qū)收到數(shù)據(jù)時(shí),該事件被觸發(fā)。當(dāng)輸入緩存有數(shù)據(jù)時(shí)將觸發(fā)該事件,對(duì)從串口收到的數(shù)據(jù)進(jìn)行處理。
Spcomm串行通信控件具有多線(xiàn)程的特性,接收和發(fā)送數(shù)據(jù)分別在兩個(gè)線(xiàn)程內(nèi)完成,接收線(xiàn)程負(fù)責(zé)收到數(shù)據(jù)時(shí)觸發(fā)OnReceiveData事件;用WriteCommData()函數(shù)將待發(fā)送的數(shù)據(jù)寫(xiě)入輸出緩沖器,發(fā)送線(xiàn)程在后臺(tái)完成數(shù)據(jù)發(fā)送工作。在接收和發(fā)送數(shù)據(jù)前需要初始化串口,用StartComm方法打開(kāi)串口,退出程序時(shí)用StopComm方法關(guān)閉串口。
Spcomm應(yīng)用的核心在于主線(xiàn)程、讀線(xiàn)程和寫(xiě)線(xiàn)程之間的消息傳遞機(jī)制,而通信數(shù)據(jù)相關(guān)信息的傳遞也是以消息傳遞的方式進(jìn)行的。在使用Spcomm進(jìn)行串口通信編程,除按照說(shuō)明使用外,還需要特別注意以下兩個(gè)問(wèn)題。
首先,Spcomm是通過(guò)ReadIntervalTimeout屬性的設(shè)置,來(lái)確定所接收到的數(shù)據(jù)是否屬子同一幀數(shù)據(jù),其默認(rèn)值是100ms,也就是說(shuō),只要任何兩個(gè)字節(jié)到達(dá)的時(shí)間間隔小于1OOms,都被認(rèn)為是屬于同一幀數(shù)據(jù),在與單片機(jī)協(xié)同工作時(shí),要特別注意這個(gè)問(wèn)題[2]。
另外,Spcomm的默認(rèn)屬性設(shè)置是支持軟件流控制的,用于流控制的字符是13H(XoffChar)和11H(XonChar),當(dāng)單片機(jī)以二進(jìn)制方式發(fā)送數(shù)據(jù)時(shí),必須要禁用Spcomm對(duì)于軟件流控制的支持,否則,在數(shù)據(jù)幀中出現(xiàn)的13H,11H會(huì)被Spcomm作為控制字符而加以忽略。
聯(lián)系客服