前段时间我们一个团队做了一个某某管理系统,这个系统是基于物联网的,这个团队是我第一次参团,也是我见过的最优秀的团队。做硬件的非常的厉害;写文档的也是一流的;做网页的是学硬件的,他从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);
}
|
上个图得瑟一下,嘻嘻.................
本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1220379,如需转载请自行联系原作者