开发者社区> 科技小先锋> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

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

相关文章
单片机与PC机串口通信编程
单片机与PC机串口通信编程
29 0
【操作系统】2.1.4 进程通信
【操作系统】2.1.4 进程通信
14 0
RPC通信原理
RPC通信原理
81 0
MFC 在对话框显示图片的多种方法
我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.
1227 0
进入MFC讲坛的前言(一)
在这里,我想谈谈自己学习MFC的一些体会。我是从1997年才开始在Window下编写程序的。在这之前,我编写过一些DOS程序,包括一个简单的全屏幕编辑器和一个带函数的表达式解释器,都是一些小的程序。Window 3.1流行后,我开始在它下面编写程序。
838 0
mfc删除标题和边框
//删除标题和边框WS_CAPTION和WS_BORDER风格 ModifyStyle(WS_CAPTION, 0);ModifyStyle(WS_BORDER, 0);
772 0
MFC对话框编程
1. 利用VisualC++新建一个对话框 2. 对话框类的继承特性: cobject     ccmdtarget      cwnd       //由cwnd派生,是一个窗口类       cdialog      在VC++ 中,一个窗口与一个C++类进行关联,对话框的基类为CDialog 类。
997 0
VC对话框全屏显示及相应控件位置改变(转)
一、简单对话框全屏显示方法 在OnInitDialog()中任意加入: 1、ModifyStyle(WS_CAPTION,0,0); //如果不想去掉标题栏,去掉该句。 SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0); 2、ShowWindow(SW...
732 0
VC 编译命令开关
/C:在预处理输出中保留注释语句/c:只编译,不连接,相当于在"Build"菜单下选择了"Compile"/D:定义常量和宏,与源程序里的#define 有相同效果/E:预处理C、C++源文件...
822 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载