MFC 串口通信

简介:

  前段时间我们一个团队做了一个某某管理系统,这个系统是基于物联网的,这个团队是我第一次参团,也是我见过的最优秀的团队。做硬件的非常的厉害;写文档的也是一流的;做网页的是学硬件的,他从0开始15天就做了一个中型php还用上了ajax技术的网站。我主要负责软件这一块。

   在这偶然的一次接触了有关comm控件的软件制作(数据流为单片机的数据流)。不多说了讲正题。。

   本例单片机波特率为9600,其他波特率也适用

   

   vs6++为例

  第一步:MSComm 加入到工程

   打开“Project->Add To Project->Components and Controls->Registered Activex Controls”,然后选择控件:Microsoft Communication Control,version 6.0插入到当前的工程中。这样就将类 CMSComm 的相关文件 mscomm.cpp 和 mscomm.h 一并加入到了工程中。编程时只需将控件对话中的 MSComm 控件拖至你的应用对话框中就OK了(看下图)。

   

  第二步、然后编写代码段:

   以下代码基本上(设计到硬件)由那个学硬件又学网站的提供

   头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#if !defined(AFX_COMSET_H__8C6F9DCA_19EE_46AA_949D_DB41B36308B0__INCLUDED_)
#define AFX_COMSET_H__8C6F9DCA_19EE_46AA_949D_DB41B36308B0__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ComSet.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CComSet dialog
class  CComSet :  public  CDialog
{
// Construction
private :
     CString string;
                       
public :
//  CString address;
//  CString values;
     void  setString(CString astring){
     string = astring;
     }
     CString getString(){
     return  string;
     }
public :
     CComSet(CWnd* pParent = NULL);    // standard constructor
     DECLARE_DYNCREATE(CComSet)
// Dialog Data
     //{{AFX_DATA(CComSet)
     enum  { IDD = IDD_COMSET };
     CButton m_butt;
     CComboBox   m_Port;
     CString m_edit;
     CString m_edit2;
     //}}AFX_DATA
// Overrides
     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(CComSet)
     protected :
     virtual  void  DoDataExchange(CDataExchange* pDX);     // DDX/DDV support
     //}}AFX_VIRTUAL
// Implementation
protected :
     // Generated message map functions
     //{{AFX_MSG(CComSet)
     afx_msg  void  OnOpencom();
     afx_msg  void  OnOnCommMscomm1();
     afx_msg  void  OnEditchangeCombo1();
     virtual  BOOL  OnInitDialog();
     afx_msg  void  OnButton2();
     afx_msg  void  OnTimer( UINT  nIDEvent);
     DECLARE_EVENTSINK_MAP()
     //}}AFX_MSG
     DECLARE_MESSAGE_MAP()
};
//`AFX_INSERT_LOCATION`
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_COMSET_H__8C6F9DCA_19EE_46AA_949D_DB41B36308B0__INCLUDED_)


   cpp文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
// ComSet.cpp : implementation file
//
//待修改setTimer(1,10000,null)
#include "stdafx.h"
#include "gucangxitong.h"
#include "ComSet.h"
#include "mscomm.h"
#include "HistoryDataC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static  char  THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
extern  HistoryDataC* histrycdialogc;
CMSComm m_Com;
int  n=0,flag=0,flag1=0;
int  l = 1;
int  tmpleng;
CString mbuttonstr =  "打开串口" ;
IMPLEMENT_DYNCREATE(CComSet, CDialog)
CComSet::CComSet(CWnd* pParent  /*=NULL*/ )
     : CDialog(CComSet::IDD, pParent)
{
     //{{AFX_DATA_INIT(CComSet)
     m_edit = _T( "" );
     m_edit2 = _T( "" );
     //}}AFX_DATA_INIT
}
void  CComSet::DoDataExchange(CDataExchange* pDX)
{
     CDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(CComSet)
     DDX_Control(pDX, IDC_OPENCOM, m_butt);
     DDX_Control(pDX, IDC_COMBO1, m_Port);
     DDX_Text(pDX, IDC_EDIT1, m_edit);
     DDX_Text(pDX, IDC_EDIT2, m_edit2);
     //}}AFX_DATA_MAP
}
/*
BOOL CComSet::OnInitDialog1()
{
  CComSet::OnInitDialog();//这是我从父对话框的初始化函数抄来的
return FALSE;
}*/
BEGIN_MESSAGE_MAP(CComSet, CDialog)
     //{{AFX_MSG_MAP(CComSet)
     ON_BN_CLICKED(IDC_OPENCOM, OnOpencom)
     ON_CBN_EDITCHANGE(IDC_COMBO1, OnEditchangeCombo1)
     ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
     ON_WM_TIMER()
     //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CComSet message handlers
void  CComSet::OnOpencom()
{
                                                                                                                       
     // TODO: Add your control notification handler code here
     if (flag==0)
     {
     CString str;
     m_Port.GetWindowText(str);
                                                                                                                   
     if (str.Find( "COM1" ,0)!=-1)n=1;
     else     if (str.Find( "COM2" ,0)!=-1)  n=2;
         else     if (str.Find( "COM3" ,0)!=-1)  n=3;
             else     if (str.Find( "COM4" ,0)!=-1)  n=4;
                 else     if (str.Find( "COM5" ,0)!=-1)  n=5;
                     else     if (str.Find( "COM6" ,0)!=-1)  n=6;
                         else     if (str.Find( "COM7" ,0)!=-1)  n=7;
                             else     n=8;
     //str.Empty();
                             if (flag1==0)
                             {
                                 DWORD  style=WS_VISIBLE|WS_CHILD;
                                 if  (!m_Com.Create(NULL,style,CRect(0,0,0,0), this ,IDC_MSCOMM1))
                                 {
                                     TRACE0( "Failed to create OLE Communications Control\n" );
                                     // return -1; //fail to create 
                                 }   flag1=1;
                             }
     m_Com.SetCommPort(n);  //选择COM1
     m_Com.SetInBufferSize(1024);  //设置输入缓冲区的大小,Bytes
     m_Com.SetOutBufferSize(512);  //设置输入缓冲区的大小,Bytes
     if (!m_Com.GetPortOpen())  //打开串口 
     m_Com.SetPortOpen(TRUE);
     m_Com.SetInputMode(1);  //设置输入方式为二进制方式
     m_Com.SetSettings( "9600,n,8,1" );  //设置波特率等参数
     m_Com.SetRThreshold(1);  //为1表示有一个字符引发一个事件    
     m_Com.SetInputLen(0);
     //if(!m_Com.GetPortOpen())
     //  MessageBox("串口不可用");
     //else {
     SetTimer(1,1000,NULL);
     m_butt.SetWindowText( "关闭串口" );
     mbuttonstr =  "关闭串口" ;
     MessageBox( "打开" );
     flag=1;
     //}
     }
     else {
     m_Com.SetPortOpen(FALSE);
     KillTimer(1);
     MessageBox( "关闭" );
     flag=0;
     m_butt.SetWindowText( "打开串口" );
     mbuttonstr =  "打开串口" ;
     }
}
BEGIN_EVENTSINK_MAP(CComSet, CDialog)
     //{{AFX_EVENTSINK_MAP(CComSet)
     ON_EVENT(CComSet, IDC_MSCOMM1, 1  /* OnComm */ , OnOnCommMscomm1, VTS_NONE)
     //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void  CComSet::OnOnCommMscomm1()
{
     // TODO: Add your control notification handler code here
         VARIANT variant_inp;
     COleSafeArray safearray_inp;
     LONG  len,k;
     int  m_ctrlHexDisplay=0;
     BYTE  rxdata[2048];  //设置BYTE数组
     //  if(m_edita.GetLineCount()>19)
     //{
     //  m_edit1.Empty();
     //  m_edit1="***The Length of the Text is too long, Emptied Automaticly!!!***\r\n";      
     //  UpdateData(FALSE);
     //}
                                                                                                                   
     CString strtemp;
     if (m_Com.GetCommEvent()==2)      //事件值为2表示接收缓冲区内有字符
     {
         variant_inp=m_Com.GetInput();    //读缓冲区
         safearray_inp=variant_inp;            //VARIANT型变量转换为ColeSafeArray型变量
         len=safearray_inp.GetOneDimSize();  //得到有效数据长度
                                                                                                                   
         for (k=0;k<len;k++)
             safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
     //  m_edit.Empty();
         for (k=0;k<len;k++)              //将数组转换为Cstring型变量
         {
                                                                                                                       
             BYTE  bt=*( char *)(rxdata+k);       //字符型
             if (m_ctrlHexDisplay)
                 strtemp.Format( "%02X " ,bt);  //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
             else
                 strtemp.Format( "%c" ,bt);  //将字符送入临时变量strtemp存放
                 m_edit += strtemp;    
         }
     //  TRACE(m_edit + "");
                                                                                                                   
                                                                                                                   
     }
                                                                                                                   
         if (l == 2){
         //  TRACE("m_edit:" + m_edit + "\n");
             m_edit = m_edit.Mid(tmpleng, (m_edit.GetLength() - tmpleng));
             tmpleng = m_edit.GetLength();
         setString(m_edit);
     //TRACE("m_edit:" + m_edit + "\n");
                                                                                                                   
     histrycdialogc->addStrings(getString());
                                                                                                                   
         }
         l = (l++)%3;
     //  m_edit.Empty();
             UpdateData(FALSE);
}
void  CComSet::OnEditchangeCombo1()
{
                                                                                                                   
}
BOOL  CComSet::OnInitDialog()
{
     CDialog::OnInitDialog();
     // TODO: Add extra initialization here
     // TODO: Add your control notification handler code here
     m_Port.SetWindowText( "COM1" );
     m_Port.AddString( "COM1" );
     m_Port.AddString( "COM2" );
     m_Port.AddString( "COM3" );
     m_Port.AddString( "COM4" );
     m_Port.AddString( "COM5" );
     m_Port.AddString( "COM6" );
     m_Port.AddString( "COM7" );
     m_Port.AddString( "COM8" );
                                                                                                                   
     UpdateData(FALSE);            //更新内容
     return  TRUE;   // return TRUE unless you set the focus to a control
                   // EXCEPTION: OCX Property Pages should return FALSE
}
void  CComSet::OnButton2()
{
     // TODO: Add your control notification handler code here
         UpdateData(TRUE);  //读取编辑框内容
         m_Com.SetOutput(COleVariant(m_edit2)); //发送ASCII字符数据
}
     /*if(!bShow){
                                                                                                                       
         if(mbuttonstr == "关闭串口"){
         m_Com.SetPortOpen(FALSE);
     flag=0;
         }
     }else{
         if(mbuttonstr = "关闭串口"){
     m_Com.SetPortOpen(true);
     flag=1;
         }
     }
*/
void  CComSet::OnTimer( UINT  nIDEvent)
{
     // TODO: Add your message handler code here and/or call default
     histrycdialogc->Store();
     CDialog::OnTimer(nIDEvent);
}

   

   上个图得瑟一下,嘻嘻.................

   133529438.jpg

   

   本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1220379,如需转载请自行联系原作者

相关文章
|
30天前
|
存储 传感器 安全
【串口通信】使用C++和Qt设计和实现串口协议解析器(二)
【串口通信】使用C++和Qt设计和实现串口协议解析器
48 0
|
30天前
|
存储 开发框架 算法
【串口通信】使用C++和Qt设计和实现串口协议解析器(一)
【串口通信】使用C++和Qt设计和实现串口协议解析器
90 0
|
6月前
|
芯片
STM32速成笔记(五)—串口通信
本文介绍了串口通信的概念,用途以及一些相关概念。介绍了如何进行printf重定向,如何根据接收到的特定信息,执行特定操作。此外,本文以通过上位机发送特殊指令控制LED亮灭的小项目,给出了详细的配置方法和程序设计。
121 0
STM32速成笔记(五)—串口通信
|
10月前
QT上位机串口+STM32单片机项目(一)
QT上位机串口+STM32单片机项目
443 0
|
10月前
QT上位机串口+STM32单片机项目(二)
QT上位机串口+STM32单片机项目
164 0
|
10月前
|
缓存
LabVIEW串口通信
串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。在LabVIEW中串口通信使用范围非常广泛,例如,通过串口使用ModBus协议驱动仪器、串口驱动PLC设备等。
|
缓存 C++
Qt | 串口通信 QSerialPort
使用QSerialPort实现串口通信功能。
532 0
|
存储 API 数据库
【MFC】MFC基础篇(1)
【MFC】MFC基础篇(1)
【MFC】MFC基础篇(1)
|
Windows
MFC消息机制
何谓消息、消息处理函数、消息映射?消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作是你的一系列代码。称为消息处理函数。 在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。
996 0