http://tech.163.com/school · 2005-10-08 17:59:47 · 來源: 天極網
首先,在對話框中創(chuàng)建通信控件,若Control工具欄中缺少該控件,可通過菜單Project --> Add to Project --> Components and Control插入即可,再將該控件從工具箱中拉到對話框中。此時,你只需要關心控件提供的對 Windows 通訊驅動程序的 API 函數的接口。換句話說,只需要設置和監(jiān)視MSComm控件的屬性和事件。
打開所需串口后,需要考慮串口通信的時機。在接收或發(fā)送數據過程中,可能需要監(jiān)視并響應一些事件和錯誤,所以事件驅動是處理串行端口交互作用的一種非常有效的方法。使用 OnComm 事件和 CommEvent 屬性捕捉并檢查通訊事件和錯誤的值。發(fā)生通訊事件或錯誤時,將觸發(fā) OnComm 事件,CommEvent 屬性的值將被改變,應用程序檢查 CommEvent 屬性值并作出相應的反應
// 若是在SDI中使用該控件則要調用下兩句,在對話框程序中該語句有MFC自己創(chuàng)建
// 所以不用人為添加
DWORD style=WS_VISIBLE;
m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1);
// 串口控件的初始化
DWORD style=WS_VISIBLE;
m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1);
if(m_MSComm.GetPortOpen()) //如果串口是打開的,則行關閉串口
{
m_MSComm.SetPortOpen(FALSE);
}
m_MSComm.SetCommPort(1); //選擇COM1
m_MSComm.SetInBufferSize(1024); //接收緩沖區(qū)
m_MSComm.SetOutBufferSize(1024);//發(fā)送緩沖區(qū)
m_MSComm.SetInputLen(0);//設置當前接收區(qū)數據長度為0,表示全部讀取
m_MSComm.SetInputMode(1);//以二進制方式讀寫數據
m_MSComm.SetRThreshold(1);//接收緩沖區(qū)有1個及1個以上字符時,將引發(fā)接收數據的OnComm事件
m_MSComm.SetSettings("9600,n,8,1");//波特率9600無檢驗位,8個數據位,1個停止位
if(!m_MSComm.GetPortOpen())//如果串口沒有打開則打開
m_MSComm.SetPortOpen(TRUE);//打開串口
else
m_MSComm.SetOutBufferCount(0);
// 控件事件的響應聲明
// *.h
//{{AFX_MSG(CGolfView)
afx_msg BOOL OnComm();
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
// *.cpp
BEGIN_EVENTSINK_MAP(CGolfView, CView)
//{{AFX_EVENTSINK_MAP(CAboutDlg)
ON_EVENT(CGolfView, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
// 控件事件的響應
BOOL CGolfView::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設置BYTE數組 An 8-bit integerthat is not signed.
CString strtemp;
switch(m_MSComm.GetCommEvent())
{
case 1: // comEvSend發(fā)送數據
break;
case 2: // comEvReceive讀取數據
// MessageBox(_T("讀取數據事件"), _T("TRACE"), MB_OK);
variant_inp=m_MSComm.GetInput(); //讀緩沖區(qū)
safearray_inp=variant_inp; //VARIANT型變量轉換為ColeSafeArray型變量
len=safearray_inp.GetOneDimSize(); //得到有效數據長度
// 接受數據
for(k=0; k
{
safearray_inp.GetElement(&k,rxdata+k); //轉換為BYTE型數組
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
recd+=strtemp;
}
// UpdateData(TRUE);
break;
default: // 傳輸事件出錯
m_MSComm.SetOutBufferCount(0);
break;
}
UpdateData(FALSE); //更新圖象內容
return TRUE;
}