Delphi 基於狀態機的串列埠通訊

2022-05-06 17:57:08 字數 4097 閱讀 6568

序列通訊介面(如rs232、rs485等)作為計算機與微控制器互動資料的主要介面,廣泛用於各類儀器儀表、工業監測及自動控制領域中。

通訊協議是需要通訊的雙方所達成的一種約定,它對包括資料格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字元定義等問題作出統一規定,在雙方的通訊中必須共同遵守。在實際應用系統中,如果缺少乙個嚴格、合理、規範的串列埠通訊協議,將無法保證資料傳輸的正確性及通訊的可靠性。

因此,需要提出一種基於狀態機串列埠通訊協議的設計方法:通過合理地設定資料報格式來保證了資料傳輸的正確性:引入了狀態機方法,簡化了協議的實現難度,提高了通訊的可靠性,同時使通訊過程具有較高的容錯能力。

串列埠通訊中最小的的資訊單元是資料幀。

乙個資料幀通常包括起始位、資料位、結束位,另外還可以包含用於檢測傳輸錯誤的「奇偶校驗位」,每個資料幀中傳輸的資料位可以有5、6、7、8或9個。

實際通訊過程中,資料的傳送是一幀一幀地進行,當被傳輸的資料超過一幀時(例如浮點型資料),如果沒有對資料幀進行必要的打包,傳送出去的資料將會很難被資料接收方解釋與分析,進而造成資料傳輸混亂與錯誤。因此,在一般應用中有必要將資料幀組裝成資料報再傳送。

起始標誌表示開始接收乙個新的資料報。

資料長度命令和附加資料共佔的位元組數。設定此欄位,可方便接收方識別資料報的長度並能夠準確地接收資料報。

命令用來說明資料報的用途。

附加資料當命令不同時,含義不同。

校驗是對命令字段與附加資料字段的所有位元組資料的異或校驗。

結束標誌表示該資料報結束。

另外,在多機通訊中,資料報中還應增加源位址與裝置位址等字段。

狀態機由事物所處的狀態及引發狀態變化的外部事件兩部分組成。

在軟體程式設計中,事物所處的狀態可以描述為某個程式片斷或函式,而引發狀態變化的處部條件可以理解為條件判斷語句,當條件為真時,事物的狀態發生變化。事物發生變化前的狀態稱為現態,變化後的狀態稱為次態,程式中可以通過不同的數字對不同的狀態進行編號。現態到次態的變化可以通過狀態變數值的改變來描述。

在協議中需要傳輸的基本資訊單元是資料報,資料報一般包含多個資料幀。實際傳輸過程中,資料的傳輸通常是一幀一幀地進行,資料報是被拆分成若干幀資料後再進行傳輸,資料接受方也是分幀接受乙個資料報。

資料接受方在解釋與分析資料報時可能存在兩個問題:

1.識別並接收完整的資料報2.資料傳輸時的容錯能力

為解決上面的兩個問題,在協議中引入了狀態機。

在狀態機中,狀態的變化依賴於外部觸發條件,當條件滿足時,狀態將發生變化。

在協議中將資料報接收的各個階段定義為不同的狀態,將接收一幀新的資料或資料處理的結果作為外部觸發條件,從而達到狀態改變的目的,最終完成乙個資料報的接收與校驗。

串列埠通訊協議中,傳送資料報時一般不需引入狀態機,這主要是為提高傳送速率和簡化程式設計模型而考慮。

在協議中主要針對資料接收過程建立狀態機。

當未開始接收資料報或發現資料傳輸出錯時,系統進入空閒狀態;

當數接收到資料報起始標誌時,變為收到起始標誌狀態,如果收到的資料不為起始標誌,系統繼續保持空閒狀態;

進入收到起始標誌狀態後,新接收到的任何資料將被當作資料報中命令與附加資料的總位元組數(記為len),系統進入收到資料長度狀態;

繼續接收新的資料,直至接到新收到的資料總位元組數達到len +2,進入檢驗結束標誌狀態;

這時可以檢驗結束標誌是否為協議定義的標誌值,如果是,說明傳輸正確,否則傳輸出錯,出錯後應查詢接收緩衝區中本資料報的起始標誌後有無其它起始標誌,如果沒有發現起始標誌,系統應進入空閒狀態,否則應直接進入接收到起始標誌狀態,這樣可提高系統容錯能力,方便系統從錯誤中恢復。

檢驗結柬標誌正確後,進入資料校驗狀態;

校驗結果如果正確,資料報接收完成,否則說明傳輸出錯,系統進入空閒狀態。

上位機軟體中,當接收到資料時,串列埠控制項會觸發乙個事件,在事件處理**中應及時將收到的資料存入接收沖區,同時不應該把串列埠通訊協議接收部分的**放置在此事件中,否則後面到來的資料可能因為前面先到的資料沒有及時處理完畢而被沖掉,導致資料丟失。

在上位機軟體執行時,應該啟動乙個windows執行緒,用於不斷檢測接收緩衝區是否為空,不為空時則對緩衝中的資料進行處理;

執行緒類建立好後,應具體編寫執行緒類執行函式的處理過程,在其中通過狀態指示變數sp實現狀態機機制;

資料報的接收進度依據於狀態指示變數sp。

當資料接收順利時,sp的變化將會引導完成乙個資料報的接收過程。這樣處理可以簡化程式設計的模型,使協議易於實現;資料報接收過程中,一旦發現資料傳輸出錯,立即將sp置為0(空閒狀態),也就是狀態復位,使系統進入準備接收下乙個資料報的狀態,這樣可提高通訊過程的可靠性及容錯能力。

procedure

tbufferthread.execute;

vars,a :

string

; sp,mylen,oddevencheck,i :integer;

begin

sp :=0;

a :='';

while true do

begin

if quelist.count <>0

then

begin

s :=quelist.strings[0

]; quelist.delete(0);

a :=a+s;

end;

if a=''

then

continue;

if sp =0

then

begin

if ord(a[1]) =0xfe then

begin

sp :=1;

endelse

begin

end;

delete(a,

1,1);

endelse

if sp =1

then

begin

mylen :=ord(a[1

]); sp :=2;

delete(a,

1,1);

endelse

if sp =2

then

begin

if length(a) <=mylen +1

then

continue;

if ord(a[mylen +2])=0xfd then

begin

sp :=3;

endelse

begin

sp :=0;

end;

endelse

if sp =3

then

begin

for i:=2

to mylen do

begin

oddevencheck :=a[1] xor

a[i];

end;

if oddevencheck =ord(a[mylen +1]) then

begin

sp :=4;

endelse

begin

sp :=0

;

end;

endelse

if sp =4

then

begin

sp :=0;

delete(a,

1,mylen+2

);

end;

end;end;

view code

Delphi 基於狀態機的串列埠通訊

序列通訊介面 如rs232 rs485等 作為計算機與微控制器互動資料的主要介面,廣泛用於各類儀器儀表 工業監測及自動控制領域中。通訊協議是需要通訊的雙方所達成的一種約定,它對包括資料格式 同步方式 傳送速度 傳送步驟 檢糾錯方式以及控制字元定義等問題作出統一規定,在雙方的通訊中必須共同遵守。在實際...

基於狀態機的按鍵程式

基於狀態機的按鍵程式 一般的按鍵輸入軟體介面程式非常簡單,在程式中一旦檢測到按鍵輸入口為低電平 有時可能為高 便採用軟體延時的方法來進行消抖,然後再次檢測按鍵輸入,如果再次確認為低電平則表示有按鍵按下,轉入執行按鍵處理程式。如果延時後檢測的電平為高電平則放棄本次按鍵檢測,重新開始一次按鍵檢測過程。在...

基於狀態機的遊戲框架

有限狀態機就是乙個具有有限數量狀態,並且能夠根據相應的操作從乙個狀態變換到另乙個狀態,而在同一時刻只能處在一種狀態下的智慧型體。英文 finite state machine 簡稱 fsm 最簡單的狀態機 if else 實際上if else就是乙個最有兩種狀態的狀態機,分別是true和false ...