VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程


首先,在  vs2008  環境下創建  MFC  運用程序
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
設置項目名稱為  ComTest (這個地方隨意命名,根據個人習慣),點擊確定后, 點擊下一步
出現如下界面
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
選擇“基於對話框”模式然后直接點擊完成即可(其他選項按默認方式),點擊完成后出現如下界面
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
解決資源管理器中自動給你生成好代碼目錄(可點擊菜單欄“視圖”選項打開解決方案資源管理器),如下圖所示
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
我們再次回到對話框編輯窗口,刪除自動生產的控件(靜態文本控件、確定和取消按鈕控件),並在工具箱里添加兩個button按鈕和編輯框,之后的界面如下圖所示:
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
然后把最重要的串口通信控件加入到工具箱中,因為默認的工具箱是不帶 MS 串口通信控件的。添加方法如下:在工具箱界面點擊鼠標右鍵出現如下界面:
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
然后點擊選擇項出現如下界面,然后選擇“COM 組件”
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
找到並選中該項
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
最后點擊確定鍵,就成功添加 MS 串口通訊控件了,工具箱中就會出現串口控件圖標了
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
我們吧串口控件添加到對話框里,位置隨意,運行的時候是看不見的,所以最終界面是這樣子的
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程

下面開始添加變量,首先 IDC_MSCOMM1 添加控制變量: m_ctrlComm ,在串口通信圖標上右鍵點擊選擇添加變量,如圖:
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
完成就可以了,控件ID和類別是可以選的,下面為按鈕和編輯框添加變量時選不同的就行了。
兩個編輯框,一個用於接收顯示數據ID設置IDC_EDIT_RXDATA(在控件屬性框里設置),另一個用於輸入發送數據,ID設置IDC_EDIT_TXDATA,兩岸按鈕,一個用於發送數據,將其ID設為IDC_BUTTON_MANUALSEND,另一個用於清空接收的編輯框,ID默認就行,不再贅述。

 接着添加變量,為IDC_EDIT_RXDATA添加CString變量m_strRXData, 為IDC_EDIT_TXDATA添加CString變量m_strTXData。說 明: m_strRXData和m_strTXData分別用來放入接收和發送的字符數據。方法同上面添加串口控制變量一樣,選擇控件ID和類型即可,如圖:
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
添加串口事件消息處理函數OnComm()
回到對話框編輯界面,鼠標左鍵點擊串口控件按鈕,然后在對應的屬性欄,點擊閃電按鈕(控件事件)
VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程

VS2008基於對話框的MFC上位機串口通信(C++實現)簡單例程
添加串口事件消息處理函數,並將函數名改為OnComm,在上圖中所示位置改就行。
我們在OnComm()函數加入相 應的處理代碼就能實現自已想要的功能了。請你在函數中加入如下代碼:

void CSCommDlg::OnComm()
{
// TODO: 在此處添加消息處理程序代碼
VARIANT variant_inp;       
COleSafeArray safearray_inp;       
LONG len,k;     
BYTE rxdata[2048]; //設置BYTE數組 An 8-bit integerthat is not signed.       
CString strtemp;       
if(m_ctrlComm.get_CommEvent()==2) //事件值為2表示接收緩沖區內有字符       
{                 
  ////////以下你可以根據自己的通信協議加入處理代碼 
            variant_inp=m_ctrlComm.get_Input(); //讀緩沖區  
            safearray_inp=variant_inp; //VARIANT型變量轉換為ColeSafeArray型變量
            len=safearray_inp.GetOneDimSize(); //得到有效數據長度           
   for(k=0;k<len;k++)                   
safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組             
for(k=0;k<len;k++)                              //將數組轉換為Cstring型變量     
         {                
               BYTE bt=*(char*)(rxdata+k);//字符型        
               strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放    
////此處編譯有錯誤,可在項目屬性->配置屬性->常規里將“字符集”改為使用多字節字符集即可
               m_strRXData+=strtemp; //加入接收編輯框對應字符串        
           }
     }       
     UpdateData(FALSE); //更新編輯框內容 
}


打開串口和設置串口參數  
你可以在你需要的時候打開串口,例如在程序中做一個開始按鈕,在該按鈕的處理函數中打開串口。現在我們在主對話框的 CSCommTestDlg::OnInitDialog() 打開串口,找到 // TODO: Add extra initialization here,並在下面 加入如下代碼:   

// TODO: 在此添加額外的初始化代碼
m_ctrlComm.put_CommPort(5);
//選擇串口號5(筆記本沒有串口,用的虛擬串口,可以使用軟件vspd創建)
m_ctrlComm.put_PortOpen(TRUE);
//打開串口
m_ctrlComm.put_RThreshold(2);
//收到兩個字節引發OnComm事件
m_ctrlComm.put_InputMode(1);
//輸入模式選為二進制
m_ctrlComm.put_Settings(_T("9600,n,8,1"));
//設置串口參數,波特率,無奇偶校驗,位停止位,位數據位
m_ctrlComm.put_InputMode(1);   // 以二進制方式檢取數據 
m_ctrlComm.put_RThreshold(1); //參數1表示每當串口接收緩沖區中有多於或等於1個字符時將引發一個接收數據的OnComm事件 
m_ctrlComm.put_InputLen(0); //設置當前接收區數據長度為0 
m_ctrlComm.get_Input();//先預讀緩沖區以清除殘留數據  

發送數據
先為發送按鈕添加一個單擊消息即BN_CLICKED處理函數,方法和串口事件控制函數的添加方法一樣(只不過是在實踐中的 OnBnClickedButtonManualsend里添加 ),不再贅述, 在函數中添加如下代碼:

// TODO: 在此添加控件通知處理程序代碼
UpdateData(TRUE);   //讀取編輯框內容
m_ctrlComm.put_Output(COleVariant(m_strTXData)); //發送數據

運行程序,在發送編輯框中隨意輸入點什么,單擊發送按鈕,這時候在另一端的串口調試助手(或別的調試工具)接收框里就會有數據出現啦。

最后那個“清除接收框”的按鈕還沒有用到,為它添加點擊觸發時間,在函數里添加如下代碼即可:
void CSCommDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知處理程序代碼
m_strRXData="";
UpdateData(FALSE);
}
這樣簡單的串口通信就基本完成了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM