前段时间我们一个团队做了一个某某管理系统,这个系统是基于物联网的,这个团队是我第一次参团,也是我见过的最优秀的团队。做硬件的非常的厉害;写文档的也是一流的;做网页的是学硬件的,他从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);
}

   

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

   133529438.jpg