MFC制作上位機,首先需要了解的是串口的編程,一般有兩種方法,一個是使用ActiveX控件,例如mscomm串口控件,還有一個是用SerialPort類或者一些其他的串口類,這兩個的區別是使用SerialPort類不需要注冊控件,在其他沒有安裝控件的電腦上也能夠用。
一·使用mscomm串口控件
使用mscomm串口控件的方法網上一大堆,大致說一些方法和一些需要注意的地方。如果是使用VC6.0在WIN7上來編寫就會有個問題會通常說添加控件的方法為選中項目à“工程”à“添加到工程”à“Components and Controls”à“Microsoft Communications Control”這樣添加會出錯,提示為不支持此接口,這是因為此軟件在Win7上面不兼容,解決辦法是直接在工程界面上右擊à“插入ActiveX控件”然后選擇相關的控件,然后給用建立類向導,給控件添加變量名,控件相關的類會自動添加,然后就可以用了。這個控件類在但是這個在VS2008以上版本也是一樣的,對於有多種類的控件就不一樣了。
然后右擊控件添加事件,這是事件就是收到串口數據的處理函數,接下來就初始化串口就可。
二·使用SerialPort類
SerialPort類是開源的,使用起來也方便,下面是復制的其他人的教程:
1 建立程序框架工程
1、在VC6.0開發環境中,新建基於對話框的MFC應用程序名為exp,並添加主要控件,更改控件ID。
2、用Class Wizard為相應控件添加變量。主要添加的變量為顯示類型的,如編輯框、組合框等。
3.添加類文件。下載或者拷貝類文件serialport.h和serialport.cpp復制到工程所在的文件夾下,然后點擊VC6.0菜單Project->Add to Project->Files…,選擇serialport.h和serialport.cpp點擊OK,就把類文件加入了當前工程。
4.在FileView中打開expDlg.h,將頭文件說明,即加入#include "SerialPort.h",這樣就加入了CSerialPort類。通過CSerialPort類完成串口操作。
5. 在主對話框頭文件expDlg.h中定義CserialPort類對象,如果只操作一個類對象,就只定義一個類對象。
public: CSerialPort m_SerialPort; //CSerailPort類對象 BOOL m_bSerialPortOpened; //標志串口是否打開
若要操作多個串口則要為每個串口定義一個類對象,這個可以通過數組方式來定義,這里定義的類對象為m_SerialPort,再定義一個布爾變量用來標志串口是否打開,如上。
2 添加消息響應(添加3處地方)
2.1 在頭文件expDlg.h中添加消息響應函數的聲明
在CSerialPort類中有多個串口事件可以響應,在一般串口編程中,只需要處理WM_COMM_RXCHAR消息就可以了,該類所有的消息均需要人工添加消息處理函數。將處理函數名定義為OnComm(),首先在expDlg.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收緩沖區內有一個字符)的響應函數聲明:
protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CExp2Dlg) …… …… afx_msg LONG OnComm(WPARAM ch, LPARAM port); //只需添加這一行 //}}AFX_MSG
2.2 在expDlg.cpp文件中進行WM_COMM_RXCHAR消息映射:
BEGIN_MESSAGE_MAP(CExp2Dlg, CDialog) //{{AFX_MSG_MAP(CExp2Dlg) …… …… ON_MESSAGE(WM_COMM_RXCHAR, OnComm) //只需添加這一行 //}}AFX_MSG_MAP END_MESSAGE_MAP()
2.3 接收數據 的消息處理函數。手動輸入:接着在expDlg.cpp文件中手動輸入函數OnComm()的實現(注意:這里不添加按鈕,而是直接 手動輸入 整個函數體!!!)。
並在其中完成對接收到的字符的處理,將接收到的字符顯示在接收編輯框中:
LONG CExp2Dlg::OnComm(WPARAM ch, LPARAM port) { m_strEditReceiveMsg += ch; UpdateData(FALSE); //將接收到的字符顯示在接收編輯框中 return 0; }
3 串口操作函數
3.1 打開串口和關閉串口(必須先打開串口,才能發送數據,否則發生內存地址寫的錯誤!)
為按鈕添加單擊響應函數,分別為“打開串口”按鈕添加OnButtonOpen(),為“關閉串口”按鈕添加OnButtonClose(),並在OnButtonOpen()中進行初始設置:
void CExp2Dlg::OnButtonOpen() { // TODO: Add your control notification handler code here int nPort=1; //選擇串口COM1 if(ChuankouDX.InitPort(this, nPort, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512)) { ChuankouDX.StartMonitoring(); m_bSerialPortOpened=TRUE; } else { AfxMessageBox("沒有發現此串口或被占用"); m_bSerialPortOpened=FALSE; }} void CExp2Dlg::OnButtonClose() { // TODO: Add your control notification handler code here ChuankouDX.ClosePort();//關閉串口 m_bSerialPortOpened=FALSE;
3.2 發送數據
為“發送”按鈕添加OnButtonSend()。
void CExp2Dlg::OnButtonSend() { // TODO: Add your control notification handler code here if(!m_bSerialPortOpened) return; //檢查串口是否打開 char buf[100]; memset(&buf, 0, sizeof(buf)); GetDlgItemText(IDC_send, buf, sizeof(buf)); if (strcmp("NOT FOUND", buf) == 0) return; ChuankouDX.WriteToPort(buf); //發送數據 }