程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 串口通信IN C++(適用於Microsoft Visual Studio 2010/2012/2013 ,VC++6.0 )

串口通信IN C++(適用於Microsoft Visual Studio 2010/2012/2013 ,VC++6.0 )

編輯:關於C++

軟硬件平台簡介

CPU:P4 2G及以上兼容於80x86架構的中央處理器

內存:1G及以上

硬盤:80G及以上

網卡:100M及以上

操作系統:Windows XP及以上

軟件:VS2010/2012/2013Visual C++ 6.0 Keil uVision3-4 STC_ISP_V488/友善串口助手

硬件:眾多、不勝數

2.總體設計思想

串口通訊把數據的字節分解成單個的二進制比特流依次傳輸,其結構簡單,連接線少,應用非常廣泛。實現串口通信的方法很多。如:利用標准通信函數實現串口通信、利用API實現串口通信和利用ActiveX控件實現。

本文主要采用ActiveX控件Microsoft CommunicationsControl(MSComm)編程,Windows平台先進的ActiveX技術使得對串口編程不再需要處理煩瑣的細節。利用已有的AxtiveX控件,只需要編寫少量的代碼,就可以輕松高效地完成任務。

以下對ActiveX控件屬性進行簡單介紹,在ClassWizard中為新創建的通信控件定義成員對象(CMSComm m_comm),通過該對象便可以對串口屬性進行設置,MSComm控件共有27個屬性,這裡只介紹其中幾個常用屬性:

CommPort:設置並回通訊端口號。

Settings:以字符/其他的形式設置並返回波特率、奇偶校驗、數據位、停止位。 PortOpen:設置並返回通訊端口的狀態,也可以打開和關閉端口。 Input: 從接收緩沖區返回和刪除字符。 Output: 向發送緩沖區寫一個字符串。 InputLen:設置每次Input讀入的字符個數,缺省值為0,表明讀取接收緩沖區中的全部內容。 InBufferCount:返回接收緩沖區中已接收到的字符數,將其置0可以清除接收緩沖區。 InputMode:定義Input屬性獲取數據的方式(為0:文本方式;為1:二進制方式)。 RThreshold和SThreshold:表示在OnComm事件發生之前,接收緩沖區或發送緩沖區中可以接收的字符數。

3.具體設計截面圖

 

1、建立應用工程

》》》》(1)以VC++6.0為例:

創建一個基於對話框的MFC應用程序項目,選擇Project菜單下Add toProject子菜單

中的Components and Controls選項,在彈出的對話框中雙擊Registered

ActiveXControls項,則所有注冊過的ActiveX控件出現在列表框中。選擇Microsoft

Communications Controlversion 6.0,單擊insert按鈕即可將通信控件插入該工

程。添加該控件到對話框中,設置控件ID號為IDC _MSCOMM.

》》》》(2)以VS2010為例,具體參考此鏈接:

2、添加界面控件

將對話框中的按鈕“取消”刪除,將“確定”按鈕改為“退出”。在對話框中添加適當的界面控件。

本實驗中需添加的標注用的靜態控件、用於選擇串口和設置波特率的組合框分別設置控件ID號為

IDC_COMBO_SELECT和IDC _COMBO_BTL SET、添加控制開始發送/接收按鈕控件並設置控件ID號為

IDC_BUTTON_START,添加用於輸入發送數據和輸出接收數據的編輯框並設置控件ID號為

IDC_EDIT_SEND和IDC_EDIT_RECEVE,同時為其設置各種屬性。

 

-----------------------------分割分割分割--------------------------------------------

添加完後如下圖

\

3、映射控件通用消息

(1)打開MFC ClassWizard對話框,單擊Member Valuable為相應控件添加變量。添加變量名和類型如下表:

控件ID號

變量名

變量類似

IDC_EDIT_RECEVE

CString

m_strReceive

IDC_EDIT_SEND

CString

m_strSend

IDC_MSCOMM

CMSComm

m_MScomm

IDC_PORT

int

m_nPort

如下圖:

\

4、為對應控件添加代碼

(1)為按鈕IDC_BUTTON_OPEN添加單擊響應函數void CMyDlg::OnButtonOpen();函數代碼如下:

 

CMyDlg::OnButtonOpen();函數代碼如下:
   void CMyDlg::OnButtonOpen() 
{
	// TODO: Add your control notification handler code here
	if(m_MSComm.GetPortOpen())
   {
	   AfxMessageBox(_T("親,請先關閉串口!"));
	   return;
   }
   UpdateData(TRUE);
   if(m_nPort==-1)
   {
       AfxMessageBox(_T("親,請選擇串口!"));
       return;
   }
   m_MSComm.SetCommPort(m_nPort);//選擇com
   m_MSComm.SetInBufferSize(1024);//設置輸入緩沖區的大小
   m_MSComm.SetOutBufferSize(1024);//設置輸出緩沖區的大小
   m_MSComm.SetInputLen(0);//設置當前接收區數據長度為0
   m_MSComm.SetInputMode(1);//1:表示以二進制方式檢取數據
   m_MSComm.SetRThreshold(1);
  /* 接收緩沖區有1個及1個以上字符時,將引發接收數據的Oncomm事件*/
   m_MSComm.SetPortOpen(TRUE);//打開串口
   if(m_MSComm.GetPortOpen())
   {
	   GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(FALSE);
       GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(TRUE);
   }
   else
   {
       m_MSComm.SetOutBufferCount(0);
	   CString strInfo=_T("");
       strInfo.Format(_T("啊哦!打開串口COM%d失敗!"),m_nPort);
       AfxMessageBox(strInfo);
       GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(TRUE);
       GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);
   }
}

 

 

(2)為按鈕IDC_BUTTON_SEND添加單擊響應函數void CMyDlg::OnButtonSend();函數代碼如下:

 

  void CMyDlg::OnButtonSend() 
   {
	// TODO: Add your control notification handler code here
	 if(!m_MSComm.GetPortOpen())
   {
	   AfxMessageBox(_T("親,請先打開串口!"));
	   return;
   }
   UpdateData(TRUE); //讀取編輯框內容
   int nSendLength=m_strSend.GetLength();//要發送的字符串送字符數組
   CByteArray ByteArray;
   ByteArray.RemoveAll();
   ByteArray.SetSize(nSendLength);
   for(int i=0;i

 

 

(3)為按鈕IDC_BUTTON_CLOSE添加單擊響應函void CMyDlg::OnButtonClose();函數代碼如下:

 

void CMyDlg::OnButtonClose() 
{
	// TODO: Add your control notification handler code here
	 if(!m_MSComm.GetPortOpen())
   {
	   AfxMessageBox(_T("親,請先打開串口!"));
	   return;
   }
   m_MSComm.SetPortOpen(FALSE);
   GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(TRUE);
   GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);
}

 

 

(4)為組合框添加初始化函數void CMyDlg::OnSelchangeBps();編輯加入代碼如下:

 

void CMyDlg::OnSelchangeBps() 
{
	// TODO: Add your control notification handler code here
	 UpdateData(true); 
	 int nlndex=m_bps.GetCurSel();a=nlndex; 
	 switch(nlndex) 
	 {  
	 case 0: m_MSComm.SetSettings("19200,n,8,1");   break;  
	 case 1: m_MSComm.SetSettings("14400,n,8,1");   break;  
	 case 2: m_MSComm.SetSettings("9600,n,8,1");    break;  
	 case 3: m_MSComm.SetSettings("4800,n,8,1");    break;
	 default:   break; 
	 } /*參數1表示每當串口接收緩沖區中有多於或等於
	       1個字符時將引發一個接收數據的OnComm事件*/
	 UpdateData(false);
}

 

 

(5)為IDC _MSCOMM添加消息映射函數void CMyDlg::OnOnCommMscomm()以便當接收緩沖區有數據時做相應處理。添加代碼如下:

 

void CMyDlg::OnOnCommMscomm() 
{
	// TODO: Add your control notification handler code here
	VARIANT varinant_Input;
	COleSafeArray safearray_Input;
	BYTE RcvData[2048];   //設置BYTE數組 An 8-bit integerthat is not signed.
	CString strTmp=_T("");

	if(m_MSComm.GetCommEvent()==2)//事件值為2表示接收緩沖區內有字符
	{
        varinant_Input=m_MSComm.GetInput(); //讀緩沖區
        safearray_Input=varinant_Input; 
         /*--VARIANT型變量轉換為ColeSafeArray型變量--*/
		 int Length=safearray_Input.GetOneDimSize();//得到有效數據長度
		 for(long i=0;i

 

 

 

(6)為數據

void CMyDlg::OnRadio1() 
{
	// TODO: Add your control notification handler code here
	b=true;
}
void CMyDlg::OnRadio2() 
{
	// TODO: Add your control notification handler code here
	b=false;
}

接收形式添加函數void CMyDlg::OnRadio添加代碼如下:

 

 

 

5.生成可執行的EXE文件

編譯、鏈接、運行會相應工程目錄下的debug目錄下生成可執行的EXE文件。連接好串口線後運行該文件可進行串口通信。運行如下:

\

五、軟件流程圖

符號設定

流程開始符號: \

流程結束符號: \

判定符號:\

路由符號: \

文檔輸出: \

\

 

\

\\\

\

\

\\\

\

\\

\

\

\\

\

\

\

\\

 

在概念設計中,我采用單向策略.用自頂向下設計一個全局概念結構的框架,以它為骨架集成由自底向上策略中設計的各局部概念結構.

六、測試結果截圖

筆記本電腦運行如下:(分整數和字符兩種顯示格式)

A.整數顯示

\

B.字符顯示

\

C.外設測試運行如下:

\

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved