MFC RS232串列埠通訊
阿新 • • 發佈:2019-01-30
PC程式跟RS232串列埠進行通訊算是比較老的題目了,不過老歸老,只要用這個介面的硬體還在,就難免要去折騰它。而這個時候就會發現老的壞處在於資料都是半截入土,拍一拍煙塵四起,抖一抖蛛絲亂飛的玩意。
現在做這個的基本都是用的SerialPort這個類,而這個類的最新更新已經有一段歲月,所以本人在下載了這個東西之後,費了些功夫才將其修改到能執行在VS2015版本的PC程式上,在此把修改完的版本貼出來做下記錄。並將一般除錯串列埠程式都會用到的兩個軟體拿出來和大家分享。
OK,下面進入貼程式碼類的環節
SerialPort.h
SerialPort.cpp
OK,這個類貼完了,用的時候包含這兩個檔案,然後在用到的檔案裡面包含.h檔案就可以了。具體的是先建立一個CSerialPort物件CSerialPort m_SerialPort;
然後初始化這個物件
m_SerialPort.InitPort(this, 2);//初始化
m_SerialPort.OpenListenThread();//開啟偵聽執行緒
到此,就可以往埠2寫資料了,呼叫十分簡單m_SerialPort.WriteToPort(L"哈哈\n");
這樣就寫了個“哈哈”到埠中
而讀資料比較麻煩一點,因為是串列埠讀到字元會發條訊息,我們需要去響應這個訊息,具體的做法是在對話方塊類中宣告一個訊息響應函式
在對話方塊實現檔案.cpp的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP間新增訊息和函式之間的繫結,也就是afx_msg LONG OnComm(WPARAM ch, LPARAM port);//串列埠字元接收訊息
BEGIN_MESSAGE_MAP(CComDemoDlg, CDialogEx)
/*在這裡新增訊息繫結*/
END_MESSAGE_MAP()
繫結程式碼如下
//串列埠訊息對映
ON_MESSAGE(WM_COMM_RXCHAR, OnComm)
接著對響應函式進行編寫即可,本人是這麼寫的,這個寫法可以參考單不嚴謹,實際要用的話還是要做些修改LONG CComDemoDlg::OnComm(WPARAM ch, LPARAM port) { if ((clock()- revtime)>(1000 / 9600+1))//間隔時間超時計算,這裡本人將超過(1000 / 9600+1)時間間隔的兩個字元分開,而在這個時間內的字元當成是一串字元,這個時間間隔的計算並不精確,如果需要嚴格按照波特率來判斷字串是否連線的話需要加以修改 { printf("\n"); } printf("%c", ch); revtime = clock(); return 0; }
OK,到此關於RS232通訊的內容就講完了,如果覺得還是比較亂的話可以下載文章最後的DEMO。下面介紹會用到的兩個輔助軟體,其一是Virtual Serial Port Driver 7.2,這個軟體的用處在於虛擬出兩個連線著的串口出來,你可以用程式繫結其中一個,然後發資料,用串列埠除錯工具繫結另外一個來收程式,然後看看你的程式傳送有沒有問題。而接受也是一樣的。另外一個輔助軟體就是上面提到的串列埠除錯助手了,沒什麼好說的。這兩個程式會跟我的DEMO打包到一起。
DEMO和兩個輔助工具地址(後來發現釋出的DEMO有點問題,程式碼已經修改,請複製上面.h和.cpp兩檔案程式碼覆蓋掉原來的)