2016年5月2日 星期一

RS232/422/485 Anaylzer DIY PART3

看了 PART1PART2 的朋友應該會心生疑惑:「那 source code 呢?難道沒有 soruce code 可以參考嗎?」

其實程式去年就寫完了,但最近才有時間整理,寫這一系列文章也是給自己做個複習,再不然我都快忘了自己曾經寫過這麼一隻程式,而且與其放著隨風而逝,還不如拿出來拋磚引玉。



開發環境

  • C++ Builder 6: 您不需要懂 BCB6 應該也能看懂,並且改寫為其他 framework 的應用程式(如 Qt)
  • Windows 7 64: 這個對您應該沒有影響,這邊只是順帶提一下小弟的作業系統。

尚待加強之處


將 COM Port 讀取迴圈從 OnClick 移出


這是小弟常用的懶人作法,就是裡面直接呼叫 blocking IO + Application->ProcessMessages(),因為寫一般小工具實在不需要大動干戈建立 thread,當然缺點就是移動視窗時會「頓頓的」,反正又沒有要拿來賣,一個示範性質的程式也不該搞得如此複雜,應該專住在要表達的事物上。

1 COM Port -> 2 COM Ports


PART1 中,各位看官應該可以發現要用兩個 COM Port 才能同時擷取 Tx 與 Rx,但最終的成果只有一個 COM Port,這不是小弟偷懶。如果照一般人的想法,就是建立兩個 threads,分別讀取 Tx  與 Rx,但是這樣會有個問題,Lua 本身並非 thread-safe,而一般的作法是建立兩個 Lua state(VM),那你要準備兩個 script file...而且我們希望讀取 Tx/Rx 是在「同一時間點」由同一個 API 一次取得,那在 Windows 上的最佳方式就是用 WaitForMultipleObjects + Overlapped I/O,但小弟也在舊文中解釋過他的複雜性,所以第一版尚不考慮。

另外,這個版本對於分析 RS485 已經足夠,因為 RS485 是半雙工環境。

缺乏 CRC、LRC、Unpacking 等界面


要解析 MODBUS RTU 沒有 CRC 是難以做到的,這塊用 Lua 來寫效率差又辛苦,我們也需要 unpack 界面(可以參考 Perl,PHP pack()/unpack()),好讓 Lua script 可以以解開 binary 封包,這些就留給有興趣的朋友自行發揮。

善意提醒


無論您是要散佈本 source code,或是將其引用在自己的專案中,請註明來源為本 blog,如同小弟在這一系列文章中都放上了參考資料,如同您也不希望自己的貢獻被忽視了,對吧?

下載點

沒有留言:

張貼留言