电竞比分网-中国电竞赛事及体育赛事平台

分享

delphi SPCOMM的一些用法注意

 佚名2016 2023-07-31 發(fā)布于江蘇

使用串口SPCOMM接收數(shù)據(jù)的時候0x11和0x13無法接受,從時間間隔上看來可以接收,但是無法顯示。網(wǎng)上查錯誤得:

------------------------------------------------------------------------

OutX_XonXOffFlow/InX_XonXoffFlow:這個屬性是指進行發(fā)送/接收時的軟件握手標志,兩個握手信號之間的數(shù)據(jù)被認為是通訊數(shù)據(jù),收到握手信號后,通訊就中止了。

FOutx_XonXoffFlow := True;
FInx_XonXoffFlow := True;

XOffChar/XOnChar:這是指握手的字節(jié),默認的初始中,有

FXonChar := chr($11);
FXoffChar := chr($13);

至此,真相大白。0x11,0x13被占用為通訊握手信號,自然不會得到正確的處理。

問題找到了,解決也很容易。只需要在Comm的初始化中,自己定義

Comm.Inx_XonXoffFlow := False;
Comm.Outx_XonXoffFlow := False;

用Delphi 實現(xiàn)串口通信,常用的方法有:使用控件,如Mscomm和Spcomm控件等;使用API函數(shù);在Delphi 中調(diào)用其它串口通信程序。

使用API方法的優(yōu)點是比較適合于編寫較為復(fù)雜的低層次通信程序,但缺點是編寫串口通信程序較為復(fù)雜,需要掌握大量通信知識。

Spcomm是Small-Pig Team開發(fā)的一個第三方Delphi串口控件,該控件具有豐富的與串口通信密切相關(guān)的屬性及事件,提供了對串口的各種操作,且編程簡單、通用性強、可移植性好。在Delphi軟件開發(fā)中已經(jīng)成為一個被廣泛應(yīng)用的串口通信開發(fā)控件。


 

Spcomm共實現(xiàn)了三個類:串口類Tcomm、讀線程類TreadThread以及寫線程類TwziteThread[1]。Tcomm的某個實例在方法StartComm中打開串口,并實例化了一個讀線程ReadThread和一個寫線程WriteThread,它們和主線程之間進行消息的傳遞,實現(xiàn)串口通信。

在Delphi7.0中安裝Spcomm串口通信控件的方法為:選擇Delphi7.0的“Component”菜單,點擊“Install Component...”菜單項,然后在彈出的Into existing package屬性頁中Unit file name輸人框中選擇SPCOMM.pas文件,單擊兩次 “OK”按鈕后,就可以將Spcomm控件安裝到Delphi7.0的System組件頁上。


 

Spcomm串口通信控件的基本屬性、方法和事件說明如下:

CommName屬性:計算機串口端口號的名字,COM1、COM2……等,在打開串口前,必須填寫好此值。
Parity屬性:校驗位 None、Odd、Even、Mark、Space等。
BaudRate:設(shè)定支持串口通信用的波特率9600,4800等,根據(jù)實際需要來定,在串口打開后也可更改波特率,實際波特率隨之更改。
ByteSize屬性:表示一個字節(jié)中,使用多少個數(shù)據(jù)位收發(fā)數(shù)據(jù),根據(jù)具體情況設(shè)定5、6、7、8等。
StopBits屬性:表示一個字節(jié)中,使用停止位的位數(shù),根據(jù)具體情況設(shè)定1、1.5、2等。
SendDataEmpty屬性:布爾屬性,為True時表示發(fā)送緩存為空,或者發(fā)送隊列里沒有信息;為False時表示表示發(fā)送緩存不為空,或者發(fā)送隊列里有信息。
StartComm方法:用來打開通信串口,開始通信。如果失敗,則會導(dǎo)致串行口錯誤。錯誤類型大致分為串行口己處于打開狀態(tài),所以不能打開串行口,不能創(chuàng)建讀寫進程,不能建立串行口緩沖區(qū)等。
StopComm方法:用來停止通信串行口的所有進程,關(guān)閉串口。
WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word)方法是帶有布爾型返回值的函數(shù),其中參量pszStr-ingToWrite是要寫入串行口的字符串,DwSizeaf- DataToWrite是要寫入的字符串的長度。該函數(shù)通過一個寫線程向串行口輸出緩沖區(qū)發(fā)送數(shù)據(jù)。發(fā)送操作將在后臺默認執(zhí)行。如果寫線程PostMessage成功,則返回值是True,若寫線程失敗,返回值是False。
OnReceiveData(Buffer:Pointer;BufferLength:Word),其中Buffer是指向輸入緩沖區(qū)的指針。BufferLength是從緩沖區(qū)收到的數(shù)據(jù)長度。當(dāng)輸入緩沖區(qū)收到數(shù)據(jù)時,該事件被觸發(fā)。當(dāng)輸入緩存有數(shù)據(jù)時將觸發(fā)該事件,對從串口收到的數(shù)據(jù)進行處理。

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)閉串口。


 

Spcomm應(yīng)用的核心在于主線程、讀線程和寫線程之間的消息傳遞機制,而通信數(shù)據(jù)相關(guān)信息的傳遞也是以消息傳遞的方式進行的。在使用Spcomm進行串口通信編程,除按照說明使用外,還需要特別注意以下兩個問題。

首先,Spcomm是通過ReadIntervalTimeout屬性的設(shè)置,來確定所接收到的數(shù)據(jù)是否屬子同一幀數(shù)據(jù),其默認值是100ms,也就是說,只要任何兩個字節(jié)到達的時間間隔小于1OOms,都被認為是屬于同一幀數(shù)據(jù),在與單片機協(xié)同工作時,要特別注意這個問題[2]。
另外,Spcomm的默認屬性設(shè)置是支持軟件流控制的,用于流控制的字符是13H(XoffChar)和11H(XonChar),當(dāng)單片機以二進制方式發(fā)送數(shù)據(jù)時,必須要禁用Spcomm對于軟件流控制的支持,否則,在數(shù)據(jù)幀中出現(xiàn)的13H,11H會被Spcomm作為控制字符而加以忽略。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多