// 若是在SDI中使用該控件則要調用下兩句,在對話框程序中該語句有MFC自己創建
// 所以不用人為添加
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); //接收緩沖區
m_MSComm.SetOutBufferSize(1024);//發送緩沖區
m_MSComm.SetInputLen(0);//設置當前接收區數據長度為0,表示全部讀取
m_MSComm.SetInputMode(1);//以二進制方式讀寫數據
m_MSComm.SetRThreshold(1);//接收緩沖區有1個及1個以上字符時,將引發接收數據的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發送數據
break;
case 2: // comEvReceive讀取數據
// MessageBox(_T("讀取數據事件"), _T("TRACE"), MB_OK);
variant_inp=m_MSComm.GetInput(); //讀緩沖區
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;
}
新聞熱點
疑難解答