RThreshold:1每接收到1個(gè)字符就觸發(fā)一個(gè)接收數(shù)據(jù)事件)
Sthreshold:0(不觸發(fā)發(fā)送緩沖區(qū)空事件)
InputLen:1每次讀操作從緩沖區(qū)中取一個(gè)字符)
其他選項(xiàng)按照缺省設(shè)置或者根據(jù)具體設(shè)備的要求進(jìn)行設(shè)置。如果需要通過多個(gè)串行口與多臺設(shè)備通信,那么每一個(gè)串行口對應(yīng)于一個(gè)單獨(dú)的MSComm控件。串行口的設(shè)置參數(shù)既可以在對話框編輯器里設(shè)定,也可以在程序代碼中通過調(diào)用CMSComm類的成員函數(shù)設(shè)定。例如,我們可以在MyCOMDlg類的OnInitDialog成員函數(shù)中初始化MSComm控件的參數(shù),代碼如下:
BOOL CMyCOMDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//以上為MFC框架自動生成的代碼,在此不列出
//TODO:Add extra initialization here
m_wndCOM1.SetCommPort(1);
m_wndCOM1.SetSettings("9600,e,7,1");
m_wndCOM1.SetRThreshold(1);
m_wndCOM1.SetSThreshold(0);
m_wndCOM1.SetInputLen(1);
m_wndCOM1.SetPortOpen(TRUE); //打開通信口
return TRUE;//return TRUE unless you set the focus to a control
}
接下來為程序主對話框建立響應(yīng)MSComm事件的處理函數(shù),每當(dāng)MSComm控件觸發(fā)事件時(shí)該函數(shù)將被調(diào)用。在對話框編輯器中用鼠標(biāo)左鍵雙擊MSComm控件圖標(biāo),在彈出的對話框中輸入函數(shù)名OmCommCom1,該事件處理函數(shù)的原型定義和消息映射入口將自動被添加到CMyCOMDlg類中,我們所要做的只是在OnCommCom1函數(shù)中給出具體的數(shù)據(jù)處理程序段,代碼示例如下:
void CMyCOMDlg::OnCommCom1()
{
//TPDP"Add your control notification handler code here
CString sInput;
switch(m_wndCOM1.GetCommEvent())
{
case 1://comEvSend 事件
/*如有數(shù)據(jù)要發(fā)送,可采用以下代碼:
VARIANT varOut;
VariantInit(&varOut);
varOut.vt=VT_BSTR;
USES_CONVERSION;
varOut.bstrVal=SysAllocString(T20LE("My data"));
if(varOut.bstrVal){
m_wndCOM1.SetOutput(varout);
SysFreeString(varOut.bstrVal);
}
*/
break
case 2://comEvReceiv 事件,有數(shù)據(jù)到達(dá)
sInput=m_wndCOM1.GetInput().bstrVal;
//對接收到的數(shù)據(jù)做必要處理
break;
case 1009://comEventRxParity事件,奇偶校驗(yàn)錯(cuò)誤
//錯(cuò)誤處理代碼
break;
default:
break
}
在這里必須注意的一點(diǎn)是在發(fā)送字符數(shù)據(jù)時(shí),必須向MSComm控件提供Unicode格式的字符串,在以上代碼中用到了USES_CONVERSION和T2OLE宏進(jìn)行ANSI字符串到Unicode字符串的轉(zhuǎn)換,具體內(nèi)容可參考Visual所帶的MSDN文檔,在此不加贅述。
本文對Windows 98下Visual C++ 程序中使用MSComm串行通信ActiveX控件編程的方法做了探討,顯示了AcctiveX技術(shù)的強(qiáng)大功能、充分的靈活性和易用性,具有一定的實(shí)踐意義。





