VS2013,串口程序編寫和調(diào)試;參照網(wǎng)文,整理。
開發(fā)環(huán)境:VS2013
串口控件
電腦:win7,32版本
準(zhǔn)備:
· 1、下載串口控件:
壓縮包包含四個(gè)文件:MSCOMM.SRG、MSCOMM32.DEP、MSCOMM32.oca、mscomm32.ocx;
解壓后拷貝到:
C:WindowsSystem32(WIN7、Win8、Win10系統(tǒng));
C:WINDOWSsystem32(XP系統(tǒng))。
注意:64位win7、8、10系統(tǒng)還需要將mscomm32.ocx文件復(fù)制到C:WindowsSysWOW64目錄下,否則后面注冊會出錯(cuò)。
2、在C:WindowsSystem32里找到cmd.exe以管理員身份運(yùn)行:
Regsvr32 C:WINDOWSsystem32MSCOMM32.OCX
注冊成功如圖所示:
3、修改注冊表:win+R組合鍵打開“運(yùn)行”或者直接在開始菜單里找到“運(yùn)行”;輸入regedit后回車,打開注冊表管理器,在其中找到HKEY_CLASSES_ROOT項(xiàng)下的Licenses項(xiàng),添加主項(xiàng)命名為“4250E830-6AC2-11cf-8ADB-00AA00C00905”,并將鍵值修改為“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”
4、新建MFC工程:在VS 2013中新建一個(gè)MFC項(xiàng)目,比如基于對話框的一個(gè)項(xiàng)目
5、添加MSComm控件:在對話框上右擊選擇“打開ActiveX控件”,英文版“InsertActiveX Control”找到Microsoft Communications Control,version 6.0,此時(shí)在對話框中出現(xiàn)一個(gè)電話一下的按鈕,這個(gè)就是MSComm控件,軟件運(yùn)行時(shí)是看不見的
6、按你需要的,添加對話框控件:
7、在電話控件上添加映射變量;完成后, 在工程中會自動生成mscomm.h 和mscomm.cpp兩個(gè)文件;
8、在串口控件上右鍵,添加控件事件處理函數(shù):
11、打開串口按鈕回調(diào)函數(shù)編寫:
CString portnums = _T("0");//定義串口編號,默認(rèn)值串口編號為0
void Cport_demonstrationDlg::OnBnClickedBottonOpen()
{
// TODO: 在此添加控件通知處理程序代碼
Edit.GetWindowText(portnums);//獲取編輯框中的串口編號
int flag = _ttoi(portnums);//將其轉(zhuǎn)化為數(shù)值類型
if (flag)//如果輸入的串口編號為正整數(shù),才執(zhí)行下列命令
{
if (m_mscomm.get_PortOpen())
{
m_mscomm.put_PortOpen(FALSE);
}
m_mscomm.put_CommPort(flag); //選擇COM
m_mscomm.put_InBufferSize(1024); //接收緩沖區(qū)
m_mscomm.put_OutBufferSize(1024);//發(fā)送緩沖區(qū)
m_mscomm.put_InputLen(0);//設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長度為0,表示全部讀取
m_mscomm.put_InputMode(1);//以二進(jìn)制方式讀寫數(shù)據(jù)
m_mscomm.put_RThreshold(1);//接收緩沖區(qū)有1個(gè)及1個(gè)以上字符時(shí),將引發(fā)接收數(shù)據(jù)的OnComm
m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600無檢驗(yàn)位,8個(gè)數(shù)據(jù)位,1個(gè)停止位
if (!m_mscomm.get_PortOpen())//如果串口沒有打開則打開
{
m_mscomm.put_PortOpen(TRUE);//打開串口
AfxMessageBox(_T("串口打開成功"));
}
else
{
m_mscomm.put_OutBufferCount(0);
AfxMessageBox(_T("串口打開失敗"));
}
}
else
{
AfxMessageBox(_T("請先輸入需要打開串口編號"));
}
}
12、關(guān)閉按鈕回調(diào)函數(shù)編寫:
void Cport_demonstrationDlg::OnBnClickedBottonClose()
{
// TODO: 在此添加控件通知處理程序代碼
m_mscomm.put_PortOpen(FALSE);//關(guān)閉串口
AfxMessageBox(_T("串口已關(guān)閉"));
}
13、發(fā)送數(shù)據(jù)按鈕回調(diào)函數(shù)實(shí)現(xiàn):
void Cport_demonstrationDlg::OnBnClickedBottonSend()
{
// TODO: 在此添加控件通知處理程序代碼
UpdateData(true); //讀取編輯框內(nèi)容
m_mscomm.put_Output(COleVariant(m_EditSend));//發(fā)送數(shù)據(jù)
m_EditSend.Empty(); //發(fā)送后清空輸入框
UpdateData(false); //更新編輯框內(nèi)容
}
14、接收數(shù)據(jù)按鈕回調(diào)函數(shù)編寫(寫在串口事件處理程序里面):
void Cport_demonstrationDlg::OnCommMscomm1()
{
// TODO: 在此處添加消息處理程序代碼
static unsigned int cnt = 0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len, k;
unsigned int data[1024] = { 0 };
byte rxdata[1024]; //設(shè)置 BYTE 數(shù)組
CString strtemp;
if (m_mscomm.get_CommEvent() == 2) //值為 2 表示接收緩沖區(qū)內(nèi)有字符
{
cnt++;
variant_inp = m_mscomm.get_Input(); //讀緩沖區(qū)消息
safearray_inp = variant_inp; ///變量轉(zhuǎn)換
len = safearray_inp.GetOneDimSize(); //得到有效的數(shù)據(jù)長度
for (k = 0; k
{
safearray_inp.GetElement(&k, rxdata + k);
}
for (k = 0; k
{
strtemp.Format(_T("%c"), *(rxdata + k));
m_EditReceive += strtemp;
CString temp = _T(" "); //換行
m_EditReceive += temp;
}
}
UpdateData(FALSE); //更新編輯框內(nèi)容
}
-
文件
+關(guān)注
關(guān)注
1文章
566瀏覽量
24749 -
串口
+關(guān)注
關(guān)注
14文章
1554瀏覽量
76532 -
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81060 -
串口通訊
+關(guān)注
關(guān)注
1文章
260瀏覽量
24933
原文標(biāo)題:在VS2013下編寫基于MSCOMM的MFC串口通訊程序
文章出處:【微信號:愛上PLC,微信公眾號:愛上PLC】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論