首先,在
vs2008
環境下建立
MFC
運用程序
設置項目名稱爲
ComTest
(這個地方隨意命名,根據我的習慣),點擊肯定後,
點擊下一步
出現以下界面
選擇「基於對話框」模式而後直接點擊完成便可(其餘選項按默認方式),點擊完成後出現以下界面
解決資源管理器中自動給你生成好代碼目錄(可點擊菜單欄「視圖」選項打開解決方案資源管理器),以下圖所示
咱們再次回到對話框編輯窗口,刪除自動生產的控件(靜態文本控件、肯定和取消按鈕控件),並在工具箱裏添加兩個button按鈕和編輯框,以後的界面以下圖所示:
而後把最重要的串口通訊控件加入到工具箱中,由於默認的工具箱是不帶 MS 串口通訊控件的。添加方法以下:在工具箱界面點擊鼠標右鍵出現以下界面:
而後點擊選擇項出現以下界面,而後選擇「COM 組件」
找到並選中該項
最後點擊肯定鍵,就成功添加 MS 串口通信控件了,工具箱中就會出現串口控件圖標了
咱們吧串口控件添加到對話框裏,位置隨意,運行的時候是看不見的,因此最終界面是這樣子的
下面開始添加變量,首先
爲
IDC_MSCOMM1
添加控制變量:
m_ctrlComm
,在串口通訊圖標上右鍵點擊選擇添加變量,如圖:
完成就能夠了,控件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和類型便可,如圖:
添加串口事件消息處理函數OnComm()
回到對話框編輯界面,鼠標左鍵點擊串口控件按鈕,而後在對應的屬性欄,點擊閃電按鈕(控件事件)
添加串口事件消息處理函數,並將函數名改成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);
}
這樣簡單的串口通訊就基本完成了。