1. 程式人生 > >MFC RS232串列埠通訊

MFC RS232串列埠通訊

    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");
    這樣就寫了個“哈哈”到埠中

    而讀資料比較麻煩一點,因為是串列埠讀到字元會發條訊息,我們需要去響應這個訊息,具體的做法是在對話方塊類中宣告一個訊息響應函式

afx_msg LONG OnComm(WPARAM ch, LPARAM port);//串列埠字元接收訊息
    在對話方塊實現檔案.cpp的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP間新增訊息和函式之間的繫結,也就是
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兩檔案程式碼覆蓋掉原來的)