VS2013工控機間通信

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編輯框,行爲裏的MutilineWant 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 wizardvirtual 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、編譯執行程序

在調試執行時。必須兩臺機子同一時候執行此程序。而且都要開啓同一個串口號

親測,按照流程一定沒有問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章