前言
這是最好的時代,也是最壞的時代,這是一個鼓勵創新的時代,但是也是一個抄襲滿地的時代。
事實上,不站在巨人的肩膀上,沒有明確的社會分工,以人類有限的聲明,科學永遠無法進步。
概述
跑題太遠哈哈哈,很多硬件生產廠家都提供了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])的方式實現對計算機與被控硬件之間通信內容的嗅探
嗅探程序開發
要求:
- 程序能夠同時控制兩個串口
- 能夠顯示兩個串口收到的內容
- 能夠將其從虛擬串口收到的已有程序發出的內容轉發至實際串口
- 能夠將其從物理串口收到的被控硬件發出的內容轉發至已有程序
直接用最簡單的方法:
創建一個基於對話框的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類