2010-11-30 70 views
4

我正在使用通過RS232連接到PC的嵌入式設備。我如何以面向對象的形式實現串行通信協議?

我需要做一個軟件來與這個嵌入式設備進行通信。

我在Delphi中編程。過去我從未習慣使用面向對象。但我試圖改變這一點。

我無法以面向對象的方式思考解決這個問題。

我有這樣的協議:

<STX><STX><COMMAND>[<DATA><DATA>...]<CHKSUM><ETX> 

其中:

<STX> is the Start of TeXt (0x55); 
<COMMAND> can be 0x01 for read, 0x02 for write, etc; 
<DATA> is any value; 
<CHKSUM> is the checksum; 
<ETX> is the End of TeXt (0x04). 

軟件的計算機將通過串口發送命令,設備會回答,使用相同的協議。

例如:

Reset command 
PC sends  : <STX><STX><0x09><0x00><CHKSUM><ETX> 
Device answer: <STX><STX><0x09><0x00><CHKSUM><ETX> 

Get Version 
PC sends  : <STX><STX><0x00><0x02><CHKSUM><ETX> 
Device answer: <STX><STX><0x00><0x00><VER_L><VER_H><CHKSUM><ETX> 

我不得不發送一個文件流至設備。

我想獲得有關以面向對象的方式實現此功能的最佳方法的建議和/或示例。我希望能夠做單元測試。

感謝

+0

串行通信需要一個狀態機才能正常工作。有很多方法可以完成面向對象的狀態機。 – mj2008 2011-10-24 09:02:24

回答

0

排序的問題很難回答,但是從信息,我有少量,這裏就是我會做它:

要麼你的類,它知道如何序列自理或使用訪客序列化模式。這具有將數據從序列化中解耦的優點,並讓您更輕鬆地實現其他序列化機制。

所以我有一個Data類,一個Command類,其中包含一個集合(選擇您的首選容器)的數據。 Command類可能會通過公共方法處理校驗和計算。我還有一個通信類來封裝命令並開始和結束通信。然後,我會有一個負責與串口連接的類,它將有一個Send方法來引用通信類。

從可用的信息,這就是我可以想出設計明智的。

至於單元測試,具有良好的設計,你應該能夠單元測試幾乎所有東西。請記住使用存根,您不想在測試期間擊中該串行端口,因此建立一個假串行通信類,例如以字符串形式寫入,並將輸出的字符串與期望值進行比較。

1

嗯,我想有和程序員一樣多的解決方案。不知道更多關於你的系統,我可能會採用這種方法:

創建一個基礎命令類,讓說; TBaseCommand。定義你在這個級別的通用接口,如發送(),接收(),運行()等...

只填寫所有命令通用函數的代碼,例如發送,接收等...

在執行過程中會有所不同的函數被虛擬化爲在下一層中定義。 由此派生出每個命令的新類並填入命令特定的代碼,如Run()。

運行Run()可以輕鬆地讓你通過重載Run()函數來模擬屏幕上的命令。

,並且是你的傳輸協議,應該被你的通信接口(單獨的協議類?)應用和剝離。您的協議類也可以處理校驗和錯誤,並嘗試重新發送等。如果它不能解決,信號錯誤。

這是與您的有限的描述我的頭頂只有幾件事情...

3

你應該看看其他串行發送/接收通信模型,如HTTP。在.NET中,HTTPWebRequest對象是您將通過網絡發送的所有信息收集在一起的地方 - 包括命令(HTTP METHOD:GET,PUT,POST等)和字節流。 HTTPWebRequest對象(和HTTP堆棧)在內部處理計算數據校驗和的「文書工作」,將大數據分塊成較小的數據包等。所有代碼都需要構建請求對象,設置命令,分配一個數據流到請求對象的屬性,併發送。

爲什麼您應該查看現有通信對象模型(如.NET HTTP)的另一個原因是串行通信從主機CPU的角度來看通常是異步的。許多CPU時間可以在串口傳輸請求的字符時通過,並在等待響應時。針對您的請求/響應使用異步模型,以便您不會阻止調用線程並可能凍結您的UI。

要繼續使用.NET HTTP示例,HTTPWebRequest有一個GetResponse方法,該方法將發送該請求並阻塞調用線程,直到收到響應。 HTTPWebRequest也有一個BeginGetResponse()/ EndGetResponse()對,這樣您就可以發送請求並提供一個回調,以便稍後回覆到達時執行。

即使您的直接設計與線程阻塞同步調用模型一致,您至少應該研究異步編碼模式並考慮實現您的對象。您始終可以以線程阻塞同步方式調用異步方法,但以異步方式調用同步方法會更困難。現在投入一點時間,讓自己有更多的選擇。

+0

那些複雜程度遠遠超出他需求的龐大協議。把事情簡單化!推薦的方式(由Microsoft)是使用TX和RX的線程以及等待事件的重疊結構。只要沒有什麼可做的事情,線程就會休眠並釋放進程。 – 2010-12-05 02:10:52