VS2013工控機間通信2018.10.17
一、頁面佈局及加入控件
1, 安裝好vs2013如圖
2, 新建一個基於VC++的MFC項目MSCOMM
注意:點擊確定,然後下一步,這時候要將應用程序類型改成基於對話框。
接着下一步到最後一個對話框是將生成的類改成CCommDlg,然後完成
4, 將新生成的項目的對話框默認dialog edit刪去,如圖
5,點開右邊工具箱,在對話框中加入兩個Static Text,兩個Edit Control,兩個Button。更改屬性—外觀—Caption
成品圖例如以下
6,加入comm控件
右鍵空白位置,插入ActiveX控件,選擇Microsoft Communication Control, version 6.0(SP6),點擊確定。如果你的電腦沒有這個選項,說明你的VS2013沒完全安裝。CSDN有解決辦法。
這時候對話框會出現一個電話圖標,可能有一半白邊去不了。這時候右擊電話圖標點擊編輯控件就能夠去掉了。如下圖
7,定義各個控件ID 和屬性
右鍵需要更改的控件,屬性
雜項裏,ID,直接修改,兩個編輯框ID, IDC_receive, IDC_send。
小電話,IDC_MMSCOMM1
兩個按鈕,發送:IDOK,退出: IDCANCEL
8添加橫條滾動和多行顯示
對於Send編輯框,行爲裏的Mutiline、Want return,外觀裏的Horizontal Scroll改爲True,對於receive編輯框,行爲裏的Mutiline,外觀裏的Horizontal Scroll改爲True。
得到對話框如圖
9, 加入成員變量。右擊對話框,點擊類嚮導,點擊成員變量標籤。選中須要加入的id,雙擊就可以加入
依次爲下表中的ID加入變量
控件號:IDC_MSCOMM1 變量類型:CMSComm 變量名:m_ctrlcomm
控件號:IDC_receive 變量類型:CString 變量名:m_strReceive
控件號:IDC_send 變量類型:CString 變量名:m_strSend
控件號:IDC_send 變量類型:CEidt 變量名:m_ctrlSend
DC_send弄了兩個,只需要再次雙擊IDC_send就可以,只是兩次選擇的類別不一樣,如下圖:
如果,IDC_MSCOMM1控件在標籤中沒有,則在生成的對話框中右擊comm控件點擊添加變量就可以
9, 爲mscomm,兩個button加入響應事件,切換到class wizard的virtual function雙擊控件ID,加入響應事件,默認就可以,也可改爲自己想要的標題
爲comm控件加入響應事件可能雙擊不了(我就是遇到這樣的問題)。這時候僅僅要右擊comm控件圖標。點擊添加事件處理程序就可以。如上圖
這時候基本界面已經佈置好了。開始加入代碼了。
二、代碼加入
1、找到解決方式(solution explorer)的sources files點開,雙擊當中的mscommDlg.cpp我們的全部代碼將加入到這個源文件裏
2、進行串口初始化及其它串口設置
將下面代碼加入到oninitialdialog函數(複製粘貼)
m_ctrlcomm.put_CommPort(3);//選擇com3口
m_ctrlcomm.put_InputMode(1);//輸入方式爲二進制方式
m_ctrlcomm.put_InBufferSize(1024);//輸入緩衝區大小爲1024byte
m_ctrlcomm.put_OutBufferSize(512);//輸出緩衝區大小爲512byte
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//設置串口參數:9600波特率。無奇偶校驗。8個數據位,1個停止位
if(!m_ctrlcomm.get_PortOpen())
m_ctrlcomm.put_PortOpen(1);//打開串口
m_ctrlcomm.put_RThreshold(1);//每當串口接收緩衝區有多餘或等於1個字符時將引發一個接收數據的oncomm事件
m_ctrlcomm.put_InputLen(0);//設置當前接收區數據長度爲0
m_ctrlcomm.get_Input();//預讀緩衝區以清空殘留數據
m_ctrlcomm.put_CommPort(3);//選擇com3口
m_ctrlcomm.put_InputMode(1);//輸入方式爲二進制方式
m_ctrlcomm.put_InBufferSize(1024);//輸入緩衝區大小爲1024byte
m_ctrlcomm.put_OutBufferSize(512);//輸出緩衝區大小爲512byte
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//設置串口參數:9600波特率,無奇偶校驗,8個數據位,1個停止位
if(!m_ctrlcomm.get_PortOpen())
m_ctrlcomm.put_PortOpen(1);//打開串口
m_ctrlcomm.put_RThreshold(1);//每當串口接收緩衝區有多餘或等於1個字符時將引發一個接收數據的oncomm事件
m_ctrlcomm.put_InputLen(0);//設置當前接收區數據長度爲0
m_ctrlcomm.get_Input();//預讀緩衝區以清空殘留數據
3、實現發送button,退出button對應的響應函數
void CmscommDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
CDialogEx::OnOK();
UpdateData(1);//讀取編輯框內容
m_ctrlcomm.put_Output(COleVariant(m_strSend));//發送數據
}
void CmscommDlg::OnBnClickedExit()
{
// TODO: Add your control notification handler code here
m_ctrlcomm.put_PortOpen(0);//關閉串口
CDialog::OnCancel();//退出程序
}
4、實現MSComm控件對應的響應函數OnOnCommMsComm1()
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];//設置byte數組
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((char) bt);//將字符送入暫時變量strtemp存放
m_strReceive+=strtemp;//增加接收編輯框對應字符串
}
}
UpdateData(0);//更新編輯框內容
5、編譯執行程序
在調試執行時。必須兩臺機子同一時候執行此程序。而且都要開啓同一個串口號
親測,按照流程一定沒有問題。