串列埠通訊應用程式的解決方案 (轉)

gugu99發表於2007-08-15
串列埠通訊應用程式的解決方案 (轉)[@more@]

中常用串列埠簡介:
mmm:的東西,是VB中帶的一個控制元件,使用簡單,一般,由於是ActivX控制元件,打包時需要註冊好多資訊,在Delphi中使用,建議使用VCL控制元件,編譯時直接編入程式中,再不需任何其它處理。
spcomm:比較好的vcl控制元件,算是比較專業的,解剖了一下,功能比較完善。
TurboPower:公認的專業通訊vcl控制元件。可以到其站點,開放原始碼了。
我在製作串列埠通訊時三種都用過,最終全部使用TurboPower!所以也推薦大家使用它。
寫了個例子,基本的串列埠通訊都可以實現,可提供參考:
下載基地-》名稱:串列埠通訊控制器

版權宣告:以下本文只允許在本站觀看,不得以任何方式進行傳播。
發表意見請到留言版。

TurboPower串列埠通訊實際應用:
在串列埠通訊時有字元和十六進位制兩種資料傳輸方式,不論使用哪種方式,只要能正確收到資料就是目的,至於收到資料後如何處理,就要根據具體的情況來定了。

1.接收資料的方法:
輪詢和中斷(利用訊息激發事件)。
1)輪詢:每間隔一定的時間查詢一下串列埠接收快取中有無資料,有就讀出來。這種方法是很毫資源的,即沒事找事。
2)中斷:在控制元件中有OnTrigger事件,當串列埠收到資料後,即觸發此事件,無資料時什麼都不做,在這個事件中接收資料就比較科學了。
所以,提倡使用控制元件中的OnTrigger事件接收資料。

2.通訊的制定:
接收資料的一般處理方法,最基本的思路就是透過協議進行分析,所以協議的制定是至關重要的:
1)首先要確定指令的起始點,從大量的資料流中將指令分離出來,沒有起始標誌的話,結果就可想而知了,一串無效的費資料!
2)然後就是指令結束識別點,可以利用指令的長度(如果長度一定或有表示長度的資料)或結束標誌來確定,當然還可以利用下一條指令的指令頭。
3)既然頭尾都明確了,指令的擷取想來不是什麼問題了吧!但還有一種情況就是資料錯誤是的容錯,如何容錯呢,最簡單的辦法:發現不符合格式的指令,就將其拋掉或特殊處理(如要求重發)一下!
4)有效資料中如果增加一些校驗,通訊將會更加可靠!
例:#(指令頭)**(指令功能)0123456789(有效資料)**(有效資料校驗和)%(指令尾)
注:**代表變動值。

3.接收資料的分析技巧:
通訊協議制定好後,一切將以通訊協議為中心。一套協議中的所有指令可能長度都是統一的,也有可能是長短不同的,並且在OnTrigger事件中實際反應速度及快,可能一條指令資料還沒有完全收齊就已經觸發了此事件,即收到了半截指令,並且有可能繼續收取的資料中除了下半截指令外,還有下一條指令的前半截,如何處理?
我在做這種處理時是利用全域性變數,將串列埠收到的所有資料都收到該串中,然後按指令格式進行擷取,發現不合法指令做一下特殊處理(如要求重發)或拋棄。
如收到的資料串為:
#**0000012000**%#**0000000343#**000000540560**%#**0002200000**%
分段截為:
#**0000012000**%
#**0000000343
#**000000540560**%
#**0002200000**%
四條指令,其中:#**0000000343不完整,檢測到後進行拋棄處理。

技巧篇:
對於已瞭解協議的支援串列埠產品,要想進行控制,可以使用“串列埠通訊控制器”進行除錯,以摸清具體實現資料,可按如下步驟進行:
1.確定連線無誤,這是首要條件,如果錯誤將沒有成功的可能;
連線必須正確,必要時可以使用自帶的多個埠相互進行測試,已保證硬體的連線無誤。串列埠通訊線有9針和25針,多用9針,其中最重要的是2(RXD)、3(TXD)、5(GND)線,對應關係如下:
9針 25針
2 -- 3
3 -- 2
5 -- 7

2.確定通訊引數正確,如:波特率、奇偶校驗位、資料位、停止位等,以及收發的是十六進位制還是字串:

3.以上確保正確,則使用“串列埠通訊控制器”,按協議輸入資料進行收發控制了。
注意:有的儀器需要進行初始化,即先發一段啟用指令,然後才能進入工作狀態,這種設定主要是為了實現利用硬體為軟體,即類似加密狗,需要有啟用方法才行,不過該類方法使用較少。

原創作者:JPYC,望業界專家多多指正!

本文主要控制元件/例程下載可以到作者主頁免費下載:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-959461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章