前段时间我们一个团队做了一个某某管理系统,这个系统是基于物联网的,这个团队是我第一次参团,也是我见过的最优秀的团队。做硬件的非常的厉害;写文档的也是一流的;做网页的是学硬件的,他从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了(看下图)。
第二步、然后编写代码段:
以下代码基本上(设计到硬件)由那个学硬件又学网站的提供
头文件
#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文件
// 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);
}
上个图得瑟一下,嘻嘻.................
转载于:https://blog.51cto.com/7071976/1220379