| 導購 | 订阅 | 在线投稿
分享
 
 
 

VC++下用MSComm控件實現串口通訊

來源:互聯網  2008-06-01 02:11:16  評論

首先,在對話框中創建通信控件,若Control工具欄中缺少該控件,可通過菜單Project --> Add to Project --> Components and Control插入即可,再將該控件從工具箱中拉到對話框中。此時,你只需要關心控件提供的對 Windows 通訊驅動程序的 API 函數的接口。

換句話說,只需要設置和監視MSComm控件的屬性和事件。

打開所需串口後,需要考慮串口通信的時機。在接收或發送數據過程中,可能需要監視並響應一些事件和錯誤,所以事件驅動是處理串行端口交互作用的一種非常有效的方法。使用 OnComm 事件和 CommEvent 屬性捕捉並檢查通訊事件和錯誤的值。發生通訊事件或錯誤時,將觸發 OnComm 事件,CommEvent 屬性的值將被改變,應用程序檢查 CommEvent 屬性值並作出相應的反應

// 若是在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;

}

首先,在對話框中創建通信控件,若Control工具欄中缺少該控件,可通過菜單Project --> Add to Project --> Components and Control插入即可,再將該控件從工具箱中拉到對話框中。此時,你只需要關心控件提供的對 Windows 通訊驅動程序的 API 函數的接口。 換句話說,只需要設置和監視MSComm控件的屬性和事件。 打開所需串口後,需要考慮串口通信的時機。在接收或發送數據過程中,可能需要監視並響應一些事件和錯誤,所以事件驅動是處理串行端口交互作用的一種非常有效的方法。使用 OnComm 事件和 CommEvent 屬性捕捉並檢查通訊事件和錯誤的值。發生通訊事件或錯誤時,將觸發 OnComm 事件,CommEvent 屬性的值將被改變,應用程序檢查 CommEvent 屬性值並作出相應的反應 // 若是在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; }
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有