SPComm的一點小訣竅 spcomm的問題導致數據丟失

最近幾天完成了BiasDAC的程序編寫。調試的過程還算比較順利,除了幾個有點bt的小問題。其中一個困擾了我兩三天的時間,今天上午終於將其解決。

由於BiasDAC是用RS232 Serial Port通信的,延用之前的程序,使用了Delphi的SPComm控件。在之前的使用中,SPComm控件一直工作正常,使用的是一般的string進行消息的傳遞。

而BiasDAC由於通信協議的限制,消息的發送使用的是hex方式,會用到從0x00到0xFF所有的這些字符。在調試中發現,發送0x11和0x13之後,SPComm的工作就會不正常。

首先是0x11發送之後,返回的0x11消息會被忽略;其次0x13發送之後,只能返回很有限的消息,而且似乎Serial Port就此關閉,如果再發送消息,就會造成Serial Port失去響應,只能通過重新啓動計算機才能恢復。

後來上網上查詢,原來不能正常處理0x11和0x13的問題早就存在,原因是SPComm空間中兩個屬性的存在。

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;

關閉軟件握手功能即可。在一般通訊中,硬件已經具備了握手功能,所以也不會影響到正常的Comm通訊。

發佈了6 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章