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

來源:互聯網
上載者:User

首先,在對話方塊中建立通訊控制項,若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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.