SPComm的一點小訣竅 spcomm的問題導致數(shù)據(jù)丟失
最近幾天完成了BiasDAC的程序編寫。調(diào)試的過程還算比較順利,除了幾個有點bt的小問題。其中一個困擾了我兩三天的時間,今天上午終于將其解決。
由于BiasDAC是用RS232 Serial Port通信的,延用之前的程序,使用了Delphi的SPComm控件。在之前的使用中,SPComm控件一直工作正常,使用的是一般的string進行消息的傳遞。
而BiasDAC由于通信協(xié)議的限制,消息的發(fā)送使用的是hex方式,會用到從0x00到0xFF所有的這些字符。在調(diào)試中發(fā)現(xiàn),發(fā)送0x11和0x13之后,SPComm的工作就會不正常。
首先是0x11發(fā)送之后,返回的0x11消息會被忽略;其次0x13發(fā)送之后,只能返回很有限的消息,而且似乎Serial Port就此關閉,如果再發(fā)送消息,就會造成Serial Port失去響應,只能通過重新啟動計算機才能恢復。
后來上網(wǎng)上查詢,原來不能正常處理0x11和0x13的問題早就存在,原因是SPComm空間中兩個屬性的存在。
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;
關閉軟件握手功能即可。在一般通訊中,硬件已經(jīng)具備了握手功能,所以也不會影響到正常的Comm通訊。
posted on 2013-11-15 11:13 gdufo 閱讀(682) 評論(0) 編輯 收藏 所屬分類: Database (oracle, sqlser,MYSQL)