MFC 串口通信-阿里云开发者社区

开发者社区> 科技小先锋> 正文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26691 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
11096 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10713 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
21807 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6825 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
3929 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载