? ? ? ?在c++語言中實現(xiàn)與硬件的通訊,需要通過串口,串口可以讀取對應(yīng)硬件模塊如:板卡等發(fā)出來的通信協(xié)議(波特率、選擇串口、奇偶校驗、數(shù)據(jù)位、停止位等)。根據(jù)硬件發(fā)出來的數(shù)據(jù),我們通過軟件進行判斷,并實現(xiàn)一些功能。那么串口通訊如何實現(xiàn)呢?
? ? ? ?在VC環(huán)境下實現(xiàn)串口通訊常見的方法有兩種:
? ? ? ?一種方法是直接使用 MSComm32 控件。這種方法操作簡單,添加對應(yīng)的控件,然后通過程序編寫串口通訊,調(diào)用接口信息即可實現(xiàn)讀取板卡等硬件信息。另一種方法較為復(fù)雜,即使用Windows的API接口,通過編寫大量的程序?qū)懘凇1敬沃饕榻B第一種。以開發(fā)環(huán)境VC2010為例: ? ? ? ? ??
? ?一、通過MFC先創(chuàng)建一個工程。
? ?二、添加MSComm控件 :Project菜單------>Add to Project---->Components and Controls----->Registered? ? ActiveX Controls--->選擇Components: Microsoft Communications Control,? ? version 6.0 插入到當(dāng)前的Workspace中。 ?即成功添加了類CMSComm(及相應(yīng)文件:mscomm.h和mscomm.cpp ) ? ?若沒有找到“Microsoft Communications Control,version 6.0”,那可能是因為你的電腦里系統(tǒng)路徑里面沒有“MSComm32.ocx”文件,且沒有注冊MSCom32控件。讀者可以到以上鏈接下載需要的幾個文件,然后將“MSComm32.ocx”拷貝到“C:\WINDOWS\system32”路徑下面,然后點擊桌面“開始——運行”,在里面輸入:“regsvr32 C:\WINDOWS\system32\MSComm32.OCX”,然后回車確認(rèn)進行該控件的注冊。 ? ? ??
? ? ? 在ClassWizard中為新創(chuàng)建的通信控件定義成員對象,MSComm? 控件共有27個屬性,這里只介紹其中幾個常用屬性:? ? ? ? ? ? ?
? ? ? CommPort? 設(shè)置并返回通訊端口號,默認(rèn)為COM1。? ? ? ? ? ? ?
? ? ? Settings? 以字符串的形式設(shè)置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位。 ? ? ? ? ? ??
? ? ? PortOpen? 設(shè)置并返回通訊端口的狀態(tài),也可以打開和關(guān)閉端口。 ? ? ? ? ? ? ?
? ? ? Input? 從接收緩沖區(qū)返回和刪除字符。? ? ? ? ? ? ??
? ? ? Output? 向發(fā)送緩沖區(qū)寫一個字符串。? ? ? ? ? ? ?
? ? ? InputLen? 設(shè)置每次Input讀入的字符個數(shù),缺省值為0,表明讀取接收緩沖? 區(qū)中的全部內(nèi)。
? ? ? 三、回到剛才創(chuàng)建的工程,然后將“mscomm.h”和“mscomm.cpp”添加到工程里面,并在“stdafx.h”里面添加#include "mscomm.h"? 這句話。? ? ? ? ? ? ?
? ? ? 四、添加 MSComm控件,以及其它必要的控件到對話框資源(當(dāng)你成功做完第二步后,會在你的控件欄里出現(xiàn)一個MSComm控件) ? ? ? ?
? ? ? 五、為你剛才添加的控件添加相應(yīng)的控件關(guān)聯(lián)變量,例如:
? ? ? ?CMSComm m_ctrlComm;? ? ? ? ??
? ? ? ?其中控關(guān)聯(lián)變量“CMSComm m_ctrlComm;”需要你自己為它添加相應(yīng)的響應(yīng)代碼
? ? ?六、初始化COM口? ? ? ? ? ??
? ? ? ?1.在***Dlg.h 里面添加愛函數(shù)聲明“void InitComm();”? ? ? ? ? ? ??
? ? ? ?2.在***Dlg.cpp里面定義函數(shù)
? ? ? ?void CMSCommTestDlg::InitComm()??
? ? ? ? ? ? {? ? ?
? ? ? ? ? ? ? if(m_ctrlComm.GetPortOpen())? ? ? ??
? ? ? ? ? ? ? ? ? ?m_ctrlComm.SetPortOpen(FALSE);? ??
? ? ? ? ? ? ? ? ? ?m_ctrlComm.SetCommPort(1); //選擇com1? ?
? ? ? ? ? ? ? if( !m_ctrlComm.GetPortOpen())? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?m_ctrlComm.SetPortOpen(TRUE);//打開串口 ? ? ?
? ? ? ? ? ? ?else ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? AfxMessageBox("cannot open ?port");? ?
? ? ? ? ? ? ?m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無校驗,8個數(shù)據(jù)位,1個停止位
? ? ? ? ? ? ?m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數(shù)據(jù)
? ? ? ? ? ? ?m_ctrlComm.SetRThreshold(1); //串口接收緩沖區(qū)中有1個字符就引發(fā)接收OnComm事件
? ? ? ? ? ? ?m_ctrlComm.SetInputLen(0); //設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長度為0
? ? ? ? ? ? ?m_ctrlComm.GetInput();//先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)
? ? ? ? ? ? }? ? ? ? ? ? ??
?七、添加發(fā)送 和 接受串口數(shù)據(jù)的功能代碼 ? ? ? ? ? ??
? ? ? ?通過程序發(fā)送和接受串口信息即可。 ? ? ? ? ? ? ?