使用串口SPCOMM接收數據的時候0x11和0x13無法接受,從時間間隔上看來可以接收,但是無法顯示。網上查錯誤得:
------------------------------------------------------------------------
OutX_XonXOffFlow/InX_XonXoffFlow:這個屬性是指進行發送/接收時的軟件握手標志,兩個握手信號之間的數據被認為是通訊數據,收到握手信號后,通訊就中止了。
FOutx_XonXoffFlow := True;
FInx_XonXoffFlow := True;
XOffChar/XOnChar:這是指握手的字節,默認的初始中,有
FXonChar := chr($11);
FXoffChar := chr($13);
至此,真相大白。0x11,0x13被占用為通訊握手信號,自然不會得到正確的處理。
問題找到了,解決也很容易。只需要在Comm的初始化中,自己定義
Comm.Inx_XonXoffFlow := False;
Comm.Outx_XonXoffFlow := False;
用Delphi 實現串口通信,常用的方法有:使用控件,如Mscomm和Spcomm控件等;使用API函數;在Delphi 中調用其它串口通信程序。
使用API方法的優點是比較適合於編寫較為復雜的低層次通信程序,但缺點是編寫串口通信程序較為復雜,需要掌握大量通信知識。
Spcomm是Small-Pig Team開發的一個第三方Delphi串口控件,該控件具有豐富的與串口通信密切相關的屬性及事件,提供了對串口的各種操作,且編程簡單、通用性強、可移植性好。在Delphi軟件開發中已經成為一個被廣泛應用的串口通信開發控件。
Spcomm共實現了三個類:串口類Tcomm、讀線程類TreadThread以及寫線程類TwziteThread[1]。Tcomm的某個實例在方法StartComm中打開串口,並實例化了一個讀線程ReadThread和一個寫線程WriteThread,它們和主線程之間進行消息的傳遞,實現串口通信。
在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:設定支持串口通信用的波特率9600,4800等,根據實際需要來定,在串口打開后也可更改波特率,實際波特率隨之更改。
ByteSize屬性:表示一個字節中,使用多少個數據位收發數據,根據具體情況設定5、6、7、8等。
StopBits屬性:表示一個字節中,使用停止位的位數,根據具體情況設定1、1.5、2等。
SendDataEmpty屬性:布爾屬性,為True時表示發送緩存為空,或者發送隊列里沒有信息;為False時表示表示發送緩存不為空,或者發送隊列里有信息。
StartComm方法:用來打開通信串口,開始通信。如果失敗,則會導致串行口錯誤。錯誤類型大致分為串行口己處於打開狀態,所以不能打開串行口,不能創建讀寫進程,不能建立串行口緩沖區等。
StopComm方法:用來停止通信串行口的所有進程,關閉串口。
WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word)方法是帶有布爾型返回值的函數,其中參量pszStr-ingToWrite是要寫入串行口的字符串,DwSizeaf- DataToWrite是要寫入的字符串的長度。該函數通過一個寫線程向串行口輸出緩沖區發送數據。發送操作將在后台默認執行。如果寫線程PostMessage成功,則返回值是True,若寫線程失敗,返回值是False。
OnReceiveData(Buffer:Pointer;BufferLength:Word),其中Buffer是指向輸入緩沖區的指針。BufferLength是從緩沖區收到的數據長度。當輸入緩沖區收到數據時,該事件被觸發。當輸入緩存有數據時將觸發該事件,對從串口收到的數據進行處理。
Spcomm串行通信控件具有多線程的特性,接收和發送數據分別在兩個線程內完成,接收線程負責收到數據時觸發OnReceiveData事件;用WriteCommData()函數將待發送的數據寫入輸出緩沖器,發送線程在后台完成數據發送工作。在接收和發送數據前需要初始化串口,用StartComm方法打開串口,退出程序時用StopComm方法關閉串口。
Spcomm應用的核心在於主線程、讀線程和寫線程之間的消息傳遞機制,而通信數據相關信息的傳遞也是以消息傳遞的方式進行的。在使用Spcomm進行串口通信編程,除按照說明使用外,還需要特別注意以下兩個問題。
首先,Spcomm是通過ReadIntervalTimeout屬性的設置,來確定所接收到的數據是否屬子同一幀數據,其默認值是100ms,也就是說,只要任何兩個字節到達的時間間隔小於1OOms,都被認為是屬於同一幀數據,在與單片機協同工作時,要特別注意這個問題[2]。
另外,Spcomm的默認屬性設置是支持軟件流控制的,用於流控制的字符是13H(XoffChar)和11H(XonChar),當單片機以二進制方式發送數據時,必須要禁用Spcomm對於軟件流控制的支持,否則,在數據幀中出現的13H,11H會被Spcomm作為控制字符而加以忽略。