串列埠通訊 (轉)

themoney發表於2007-10-06
串列埠通訊 (轉)[@more@]

mmm的使用:namespace prefix = o ns = "urn:schemas--com::office" />

使用VC++提供的通訊控制元件MSComm 首先,在對話方塊中建立通訊控制元件,若Control工具欄中缺少該控制元件,可透過選單Project --&gt Add to Project --&gt Components and Control插入即可,再將該控制元件從工具箱中拉到對話方塊中。此時,你只需要關心控制元件提供的對 通訊的 的介面。換句話說,只需要設定和監視MSComm控制元件的屬性和事件。

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

// 若是在SDI中使用該控制元件則要下兩句,在對話方塊程式中該語句有MFC自己建立

// 所以不用人為新增

  D 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;

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-974871/,如需轉載,請註明出處,否則將追究法律責任。

相關文章