“拿來主義”——怎樣嗅探一個串口通信程序與硬件之間的通信(一)

前言

這是最好的時代,也是最壞的時代,這是一個鼓勵創新的時代,但是也是一個抄襲滿地的時代。
事實上,不站在巨人的肩膀上,沒有明確的社會分工,以人類有限的聲明,科學永遠無法進步。


概述

跑題太遠哈哈哈,很多硬件生產廠家都提供了API,但是在看那些E文說明書的時候總也不能很好的理解它們的意思,廠家雖然也提供了示例程序,但是有些廠家偷懶就是不給源代碼,尤其是計算機與硬件之間用RS-232串口相連就更bt了,退一步你用485的話我還能簡單的甩出兩根線監測一下軟件和設備之間的信息往來,232從硬件上解決則相對困難些,除非你手頭有臺示波器你自己還願意折騰……

幸而看到了一本書:獨闢蹊徑的編程思維:”拿來主義”編程[1],裏面介紹的方法比較好的解決了這個問題,底下的超鏈接是亞馬遜的購買鏈接……不知道有沒有免費的電子版,不過還是支持正版一下吧

作者採用了一個叫做VSPE的軟件來虛擬串口,進而通過自己編寫程序完成對串口通信程序與硬件之間通信的嗅探,更好的實現已有程序的“爲我所用”。高手如果熟悉這個流程了就可以點擊屏幕右上角的關閉按鈕了~

下面也是自己的一個歷程,剛開始做,之後會不定期更新,但願不要爛尾。


VSPE簡介

以下內容援引自[1]:

VSPE(Virtual Serial Ports Emulator,虛擬串口仿真)是Eterlogic公司出品的一套虛擬串口仿真驅動程序,其作用是通過各種特殊的方式,處理串口中遇到的幾乎所有與具體的串口應用無關,但與串口的監聽卻息息相關的事情

Eterlogic公司的網站上:
http://www.eterlogic.com/Products.VSPE.html
可以免費下載到32位的版本

應用它的“連接器”模式創建出一個“虛擬串口”:Com A
這個Com A可以重複的被多個程序打開,且各個程序可以藉由這個Com A實現互相之間的通信

進一步的結合自己編寫的一個程序與“物理串口”:Com B

就可以通過下圖(引自[1])的方式實現對計算機與被控硬件之間通信內容的嗅探

嗅探原理


嗅探程序開發

要求:

  1. 程序能夠同時控制兩個串口
  2. 能夠顯示兩個串口收到的內容
  3. 能夠將其從虛擬串口收到的已有程序發出的內容轉發至實際串口
  4. 能夠將其從物理串口收到的被控硬件發出的內容轉發至已有程序

直接用最簡單的方法:
創建一個基於對話框的MFC程序

以下內容參考了[2][3],其中針對多個串口進行操作的方法主要參考了[3]

1.在“xxxDlg.h”當中添加對應的頭文件(xxx是你創建的對話框類的名稱,下同):

#include "SerialPort.h"

2.在“xxxDlg.h”當中添加消息響應函數聲明

afx_msg LONG OnCommunication(WPARAM ch, LPARAM port); 

暫時將這部分代碼放在了 Protect:之下,不知道是不是這樣
但是可以肯定的是,[2]中的這個聲明被我直接照搬的時候出現了問題,[2]中的這個函數返回爲void,但是在改成LONG之前,編譯一直不通過

3.在“xxxDlg.cpp”中,添加消息聲明:

BEGIN_MESSAGE_MAP(CSerialPort01Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ///////////////////////////////////////////////////
    // 串口編程
    ///////////////////////////////////////////////////
    ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication) 
    ///////////////////////////////////////////////////
END_MESSAGE_MAP()

需要添加的是上述代碼中“串口編程”包圍的部分

4.在“xxxDlg.cpp”當中加入消息響應函數的實現(這部分比較重要,它決定了程序在收到數據後要幹些什麼,目前只是一個構架)

LONG CSerialPort01Dlg::OnCommunication( WPARAM ch, LPARAM port )
{
    ///////////////////////////////////////////////////
    // 接收後處理


    ///////////////////////////////////////////////////
    return 0;
}

5.創建串口類變量及相關變量:在“xxxDlg.h”當中添加變量聲明

// 串口變量
public:
    CSerialPort m_comm_Port[2];     //需要控制兩個串口
    CString m_strRXDataCOM_Virtual; //虛擬串口接收數據
    CString m_strRXDataCOM_Real;    //物理串口接收數據

這兩個類變量負責分別控制兩個串口的打開等等行爲
字符串變量如註釋描述

至此,一個基本的框架被建立起來,程序的具體代碼見後續內容


參考

[1] 獨闢蹊徑的編程思維:”拿來主義”編程
[2] 在VC中使用SerialPort類實現串口通信
[3] 簡單而強大的多線程串口編程工具CserialPort類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章