1. 程式人生 > >VS2012串列埠助手程式設計C++

VS2012串列埠助手程式設計C++

使用MFC來編寫串列埠程式,需要有一定的c++語言功底,要清楚MFC程式碼的組織方式。

鑑於絕大多數的教程還停留在vc6.0這個骨灰級的環境,特在此說明一下VC2012下的程式碼組織方式,和大家一起交流下~

本文略去建立窗體的步驟,但是給出了窗體的樣式,不會建立窗體的童鞋可以百度一下就知道了,很簡單的,所以就不多說啦 ~ 

0、準備工作

使用的通訊控制元件是:Microsoft Communications Control, Version 6.0

工具->選擇工具箱->COM元件 新增到工具條中,然後再新增到窗體上,任何位置都OK,編譯執行以後不顯示。

新建MFC窗體,win32下,基於對話方塊,命名為MFC(建議和我一樣,這樣方便些。)。應該都知道(不知道的可以參考百度文庫裡,好多,不多說了)

本程式碼是最簡單的串列埠程式,引數設定都在程式碼中提醒。只需要設定COM號

窗體樣式:


可以核對一下,標頭檔案名:

  1. MFC.h  
  2. MFCDlg.h  // main frame 主要窗體、父窗體的標頭檔案,主要的修改和新增程式碼區
  3. Resource.h  
  4. stdafx.h  
  5. targetver.h  
  6. 原始檔名:  
  7. MFC.cpp  
  8. MFCDlg.cpp   // main frame 主要窗體、父窗體的cpp檔案,主要的修改和新增程式碼區
  9. stdafx.cpp  

一、準備工作

1.設定控制元件屬性

各ID如下:

IDC_COMBO_CommSeclect 屬性裡面的Data:COM1;COM2;COM3;COM4;COM5;COM6; // 注意使用;分隔

2.使用  專案->類嚮導  定義變數如下



編譯一下,應該不會有錯。

下面準備新增程式碼

主要的程式碼區是 MFCDlg.h 和 MFCDlg.cpp 特別要注意,不要亂 ~

二、準備新增程式碼,接收下位機發來的資料並顯示

1.MFCDlg.cpp中初始化

函式名:
  1. BOOL CMFCDlg::OnInitDialog()  
新增如下:
  1. // TODO: 在此新增額外的初始化程式碼
  2.     m_ComboBox.SetCurSel(2);//開啟軟體時串列埠選擇框預設顯示COM1  子選項編號的排序是從0開始的。

2.MFCDlg.cpp中BUTTON1訊息響應函式 // 開啟串列埠

雙擊繪圖窗口裡的BUTTON1控制元件進入程式碼編輯區新增程式碼如下:(想省事,直接看下面的程式碼) 或者進入類嚮導(建議此方法,有利於體會MFC的程式碼組織方式)

新增程式碼如下:  //  接收下位機的資料  看懂了註釋你就可以按照需要自由組織啦。當下只是最簡單的,8位資料,1停止,9600,無校驗

  1. void CMFCDlg::OnBnClickedButton1()  
  2. {  
  3.     // TODO: 在此新增控制元件通知處理程式程式碼
  4.     //m_Index_int = ((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->GetCurSel();//當前選中的
  5.     /*********** 
  6.     GetCurSel() 函式:用以得到使用者選中下拉列表框中資料的索引值.返回的值是重0開始的,如果沒有選擇任何選項將會返回-1 
  7.     ************/
  8. //返回的是開啟的埠號
  9.     switch(m_ctrlComm.get_PortOpen())//點選開啟或關閉串列埠按鍵時,根據當前的串列埠是否開啟經行相應操作
  10.     {  
  11.     case 0://當前串列埠是關閉的,則進行開啟串列埠操作
  12.         m_Index = ((CComboBox*)GetDlgItem(IDC_COMBO_CommSeclect))->GetCurSel();//當前選中的行
  13.         m_ctrlComm.put_CommPort(m_Index + 1);//如果要開啟串列埠則應先選擇哪個串列埠
  14.         m_ctrlComm.put_PortOpen(TRUE);//開啟串列埠
  15.         UpdateData(FALSE);//更新按鍵狀態
  16.         if(m_ctrlComm.get_PortOpen())//如過已經開啟串列埠,
  17.         {  
  18.             SetDlgItemText(IDC_BUTTON1,_T("關閉串列埠"));//更改按鍵提示
  19.             m_ctrlComm.put_Settings(_T("9600,n,8,1"));//開啟軟體時埠設定預設波特率9600,無校驗位,8位資料,1位停止
  20.             m_ctrlComm.put_InputMode(1);//1:表示以二進位制方式撿取資料;
  21.                                         //0:表示以文字方式撿取資料
  22.             m_ctrlComm.put_RThreshold(1);//引數1 表示每當串列埠接收緩衝區中有多餘或等於一個字元時將引發一個接收資料的OnComm事件
  23.                                         //引數0 表示資料傳輸事件不會引發OnComm事件,即不響應。
  24.             m_ctrlComm.put_InputLen(0);//0: 預設值。表示使MSComm控制元件讀取接收緩衝區中的所有內容。
  25.             m_ctrlComm.get_Input();//先預讀緩衝區以清除殘留資料
  26.             UpdateData(FALSE);  
  27.         }  
  28.         else
  29.             AfxMessageBox(_T("串列埠開啟失敗"));  
  30.         break;  
  31.     case 1:  
  32.         //當前串列埠是開啟的則進行關串列埠操作
  33. //      m_ctrlComm.SetCommPort(m_Index_int + 1);//如果要開啟串列埠則應先選擇哪個串列埠
  34.         m_ctrlComm.put_PortOpen(FALSE);  
  35.         if(!m_ctrlComm.get_PortOpen())//如果已經關閉串列埠,
  36.         {     
  37.             SetDlgItemText(IDC_BUTTON1,_T("開啟串列埠"));  
  38.             UpdateData(FALSE);  
  39.         }  
  40.         else
  41.             AfxMessageBox(_T("串列埠關閉失敗"));  
  42.         break;  
  43.     default:  
  44.         AfxMessageBox(_T("cannot open Serial Port"));  
  45.         break;  
  46.     }  
  47.     m_ComboBox.SetCurSel(m_Index);//開啟軟體時串列埠選擇框預設顯示COM1  子選項編號的排序是從0開始的。
  48. //  m_BaudRate_M.SetCurSel(m_BaudRate);//開啟軟體時波特率選擇框預設顯示9600
  49. //  m_Data_Select_M.SetCurSel(m_Data_Select);//開啟軟體時資料位選擇框預設顯示8
  50. //  m_StopBit_M.SetCurSel(m_StopBit);//開啟軟體時停止位選擇框預設顯示N  無停止位
  51. //  m_ParityCheck_M.SetCurSel(m_ParityCheck);// 奇偶校驗
  52. }  

3.MFCDlg.cpp中Oncomm事件響應(就是那個“電話”控制元件的事件響應)


注意,此刻的標頭檔案和原始檔的內容有一些變化了,可以看一下,這兩個是IDC_MSCOMM1控制元件帶來的(新增OnComm事件後才會出現)。


新增程式碼如下:

  1. void CMFCDlg::OnOncommMscomm1()  
  2. {  
  3.     // TODO: 在此處新增訊息處理程式程式碼
  4.     VARIANT variant_inp;  
  5.     COleSafeArray safearry_inp;  
  6.     LONG len,k;  
  7.     BYTE rxdata[2048];  
  8.     CString strtemp;  
  9.     int order;  
  10.     if(m_ctrlComm.get_CommEvent() == 2)//事件值為2表示接收緩衝區內有資料
  11.     {  
  12.         //以下根據自己的通訊協議新增處理程式碼
  13.         variant_inp = m_ctrlComm.get_Input();//讀緩衝區
  14.         safearry_inp = variant_inp;//VARIANT轉化為COleSafeArray
  15.         len = safearry_inp.GetOneDimSize();//字元長度
  16.         for(k=0;k<len;k++)  
  17.         {  
  18.             safearry_inp.GetElement(&k,rxdata+k);//轉化為BYTE型陣列
  19.         }  
  20.         for(k=0;k<len;k++)//將陣列轉化成Cstring型變數
  21.         {  
  22.             BYTE bt = *(char*)(rxdata+k);  
  23.             //if(m_ctrlHexSend.GetCheck())
  24.             //  strtemp.Format("%02x",bt);
  25.             //else
  26.             strtemp.Format(_T("%c"),bt);//將字元送入臨時變數strtemp中存放  
  27.             m_strRXData+=strtemp;//加入接收編輯框對應字串
  28.             /******************* 
  29.             以上的語句可以進行對sbuf的讀取。 
  30.             ***********************/
  31.             order = _ttoi(strtemp);//order是字元轉化後的int值
  32.         }  
  33.         UpdateData(FALSE);//更新編輯框內容(主要是接收編輯框中的)
  34.     }  
  35.     m_ComboBox.SetCurSel(m_Index);//開啟軟體時串列埠選擇框預設顯示COM1  子選項編號的排序是從0開始的。
  36. //  m_BaudRate_M.SetCurSel(m_BaudRate);//開啟軟體時波特率選擇框預設顯示9600
  37. //  m_Data_Select_M.SetCurSel(m_Data_Select);//開啟軟體時資料位選擇框預設顯示8
  38. //  m_StopBit_M.SetCurSel(m_StopBit);//開啟軟體時停止位選擇框預設顯示N  無停止位
  39. //  m_ParityCheck_M.SetCurSel(m_ParityCheck);// 奇偶校驗
  40. }  

編譯執行,Bingo!

三、準備新增程式碼,向下位機發送資料

1.MFCDlg.cpp中 IDC_SendBtn 訊息響應函式 // 開啟串列埠

  1. void CMFCDlg::OnBnClickedSendbtn()  
  2. {  
  3.     // TODO: 在此新增控制元件通知處理程式程式碼
  4.     UpdateData(TRUE);  
  5.     long

    相關推薦

    VS2012串列助手程式設計C++

    使用MFC來編寫串列埠程式,需要有一定的c++語言功底,要清楚MFC程式碼的組織方式。 鑑於絕大多數的教程還停留在vc6.0這個骨灰級的環境,特在此說明一下VC2012下的程式碼組織方式,和大家一起交流下~ 本文略去建立窗體的步驟,但是給出了窗體的樣式,不會建立窗體的

    C# 串列助手小應用

    C# 串列埠助手小應用 一、簡述         記--使用C#+VS2010編寫簡單的串列埠助手小應用。(測試版本)         工程打包:連結: https://pan.baidu.com/

    C#設計串列助手

    做技術的通病,什麼都想學,什麼都想親手做一遍。不然總感覺心裡不踏實。 考研期間,利用晚上一點時間,照葫蘆畫瓢,練習使用c#快速開發一個簡單的串列埠小助手。 這種前後端分離的設計方法,大大提高了開發速度,比Python的wxPython寫軟體方便很多。 但是使用c#寫軟體

    PC通過串列助手如何給單片機發送小數,微控制器接收後如何處理?

    兩種思路,供參考。1. 原始位元組按原始位元組資料傳送,這也是我個人比較傾向的方式。首先,位、位元組和位元組流本身沒有任何意義,如果按約定的方式去解析,才能有具體的含義。用什麼約定方式呢?使用符合IEEE 754的浮點數標準,每個浮點數為4個位元組,按標準解析就可以了。其實這個標準,包括STM32在

    利用WinAPI進行串列通訊程式設計

    轉載於:https://blog.csdn.net/L_Andy/article/details/51131232 轉載只為了方便查詢,希望大家從源連線進行檢視! 總結來看串列埠通訊原理,(也可以說大多數通訊原理也是如此)。 通訊首先要有個通訊,可以簡單的把通訊看成一個

    你聽說過嗎:使用網頁技術開發桌面串列助手工具

    串列埠助手是嵌入式開發中常用到的一個桌面工具,用於串列埠除錯,而Angular 是一個Web應用框架。桌面端原生功能和硬體操作似乎永遠都不會和Web發生直接關係。然而,隨著JavaScript技術的進步和變革,一切都成為可能。Electron 是一個使用 JavaScript, HTML 和 CSS 等 We

    串列驅動程式設計詳解---串列初始化(上)

    TTY驅動程式架構: 1. TTY概念解析     1.1 /dev/ttySCA0     1.2 /dev/tty1-n     1.3 /dev/console       在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝

    串列驅動程式設計詳解---串列開啟、傳送、接收(下)

    上一篇部落格分析了串列埠驅動初始化部分,下面逐步分析串列埠驅動中的開啟串列埠,資料傳送和接收! 初始化主要工作流程: 先來分析串列埠開啟操作流程,還是先上圖: 這裡分析還是離不開上篇部落格中的兩張重要的圖: 串列埠操作重要的資料結構: 由上一篇串列埠驅動分析可知

    android藍芽4.0BLE及2.0 2.1 apk 串列助手帶16個自定義按鍵和自定義指令 字元接收 十六進位制或字元傳送

    android藍芽4.0BLE apk 帶16個自定義按鍵和自定義指令 字元接收 https://pan.baidu.com/s/1eRSfprO android藍芽2.0 2.1 apk 帶16個自定義按鍵和自定義指令 字元接收  帶自動連線 https://pan.b

    VS2013 Windows API 串列通訊程式設計--多執行緒非同步方式

    轉載自:blog.csdn.net/mingojiang 1.串列埠通訊基礎 提到串列埠讓人想起並口,它們是計算機中兩個比較重要的通訊方式. 串列埠:也叫COM口,把位元組的二進位制位按位列隊進行傳輸,每個位元組佔一個固定的時間長,速度慢,但是傳輸距離遠, 有9針和25針

    串列讀取與串列裝置程式設計蒐集內容總結

    http://blog.csdn.net/wlk1229/article/details/52566701 串列埠同步讀取的時候ReadLen = (cs.cbInQue > len) ?

    Java串列助手(程式原始碼)

      /** * Java串列埠助手  * 本程式主要是模擬delphi/vc#/vb.net的窗體構架來簡化Java的SWT應用 */ package comm; import java.io.*; import java.util.*; import java.u

    ubuntu- cp2102及串列助手

    我用的usb轉串列埠是cp2102插上cp2102後,ubuntu自動安裝了驅動,省了安裝1,cutecom 作為助手http://www.voidcn.com/article/p-xmvohnbi-bhr.html下載ubuntu下的串列埠除錯工具cutecom:在ubun

    linux串列應用程式設計入門,文件勝於一切教程

    接觸過linux程式設計的應該都知道,學習linux應用最好的參考資料就是系統自帶的手冊——通過man命令查詢程式設計手冊。 通過搜尋引擎搜尋與linux串列埠程式設計相關的關鍵字,找到與串列埠程式設計相關的結構體或者函式就可以開始自學串列埠應用程式設計了。 學習環境:de

    串列通訊模組3:串列通訊程式設計基礎(讀寫、關閉)

    上一節總結了如何開啟串列埠並討論瞭如何配置串列埠,本節是在上一節的基礎上,進一步討論串列埠程式設計的基礎——如何進行檔案讀寫?如何關閉串列埠? 1. 讀寫串列埠 串列埠的讀寫操作和檔案的讀寫操作是一樣的,也是通過ReadFile()及WriteFile()函式來實現

    python實戰串列助手---4實現串列功能

    import sysimport threadingimport timeimport serialimport binasciiimport logging class serDeal(object):    def __init__(self, Port="COM4", BaudRate="9600",

    簡單的串列助手程式開發

    1.簡介 之前在烽火集團實習的時候,開發串列埠通訊程式用的都是純C++。感覺串列埠程式開發很考驗人的邏輯思考能力。不過,現在好了,科研工作中,一切已存在的“利器”都可以用來為自己的“idea”服務。

    PIC微控制器精通_串列通訊模組C實現

    1.串列埠通訊頭/定義檔案 usart.h #ifndef _SERIAL_H_ #define _SERIAL_H_ #define BAUD 9600 #define FOSC

    串列通訊程式設計詳解(Linux)

    rs232是三芯通訊,即DB9的第2引腳RXD(接收)、第3引腳TXD(傳送資料)、第5引腳DG(訊號地)。 rs232是三芯通訊,485是兩芯通訊的,RS-232串列埠線 通常 是 DB9--DB9 的 串列埠通訊線,9芯 RS-485資料線 是 雙絞線或者遮蔽雙絞線,2

    VC++串列通訊程式設計詳解

    總結來看串列埠通訊原理,(也可以說大多數通訊原理也是如此)。 通訊首先要有個通訊,可以簡單的把通訊看成一個小桶,傳送方住水桶裡裝水,接收方從水桶中取水。如果你要和對方通訊首先需要將桶蓋開啟,再將水