|
使用串口SPCOMM接收數(shù)據(jù)的時候0x11和0x13無法接受,從時間間隔上看來可以接收,但是無法顯示。網(wǎng)上查錯誤得: ------------------------------------------------------------------------ OutX_XonXOffFlow/InX_XonXoffFlow:這個屬性是指進行發(fā)送/接收時的軟件握手標志,兩個握手信號之間的數(shù)據(jù)被認為是通訊數(shù)據(jù),收到握手信號后,通訊就中止了。 FOutx_XonXoffFlow := True; XOffChar/XOnChar:這是指握手的字節(jié),默認的初始中,有 FXonChar := chr($11); 至此,真相大白。0x11,0x13被占用為通訊握手信號,自然不會得到正確的處理。 問題找到了,解決也很容易。只需要在Comm的初始化中,自己定義 Comm.Inx_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……等,在打開串口前,必須填寫好此值。 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]。 |
|
|
來自: 佚名2016 > 《編程設(shè)計》