精华内容
下载资源
问答
  • 通过串口采集数据并实时显示趋势曲线,很有用的也费了很大力气写的
  • MATLAB 互信息采集曲线数据整理,使用能量分析攻击的任何方法进行攻击之前,我们都需要获取密码设备在运行时 的能量消耗数据。在本文中,我们搭建了一个仿真实验平台来获取 KLEIN 在加密过程 中的能量消耗数据
  • 数据采集并做曲线

    2014-03-13 18:19:28
    VB用Tchart做的数据采集,可绘制曲线,通过串口采集数据,可自由修改 内含Tchart控件,自己安装
  • QT使用动态曲线展示采集的传感器数据,温度湿度曲线源代码,包含注释
  • 实时采集数据的动态曲线控件

    千次阅读 热门讨论 2016-02-20 18:23:31
    这个曲线控件能够实时采集数据,当数据变化后,能够实时更新曲线,该控件主要功能如下:   1) 将数据点加入到控件后,控件即可按照数据点加入的时间先后顺序关系绘制数据曲线图。 2) 当手指触屏幕时,即可以显示...

    这个曲线控件能够实时采集数据,当数据变化后,能够实时更新曲线,该控件主要功能如下:

     

    1) 将数据点加入到控件后,控件即可按照数据点加入的时间先后顺序关系绘制数据曲线图。

    2) 当手指触屏幕时,即可以显示触摸点相对应的数据点的信息。

    3)  曲线的X坐标固定为时间值,Y坐标为温度值(当然也可以为电压值,电流值等任意物理量值)

    控件运行界面截图:

     

    如果对这感兴趣,可以到下面地址下载相关文档(包含了控件的完整源码,程序要点分析)

    http://download.csdn.net/detail/xingyu_soft/9438013

     

    文档目录如下:

    另外,分数不够的朋友,可以在这里留下邮箱,我会将文档发邮件给您。

     

    展开全文
  • 亲自设计 我用拉力计、电子秤都试过 运行正常 labview串口采集数据 曲线显示 实时最大最小平均值
  • VB 实时数据采集,并绘制成波形显示 显示波形,
  • VB环境下设计开发实时数据采集曲线
  • 在VB 中实现数据采集曲线绘制.详细描述了如何绘制采集数据绘图的过程。
  • 这个程序主要用到了串口通信和曲线画图 一. 主要控件 Msomm控件一个,两个timer控件,textbox控件,combo控件,picture控件,command控件 二....串口采集数据 2.用曲线动态显示数据 3. 显示时间
  • 在ARM9和ARMLinux下利用QT编写的实时数据采集数据曲线动态显示程序。
  • 1实现采集电压数据并在12864上画曲线,划分两个掉电储存区,可以实现数据储存。 2实现数据的读取,可读取储存区中的数据,并查询前后数据 3实现数据与上位机通信,将储存区的数据上传到上位机中
  • 基于 MATLAB 实时串口 数据采集曲线显示
  • C#开发的基于OPC的数据采集曲线显示软件系统,自主开发,欢迎交流 C#开发的基于OPC的数据采集曲线显示软件系统,自主开发,欢迎交流
  • 里边包括发送和接受函数的源代码,使用的是vc自带的mscomm控件,用teechart控件显示实时曲线
  • 这是一个串口温度采集系统,能够正确的读出串口传来的数据,并且可以根据数据来动态绘制曲线
  • 上位机程序, DAQ采集传感器数据,在界面上显示曲线和文本
  • 数据采集曲线的绘制

    2013-03-30 15:49:48
    想将采到的数据绘成曲线数据有2048多个。我先用内存作图,为内存DC创建兼容位图,其尺寸为长2048,宽为这组数据的最大值,然后用moveto()和lineto()函数将这些点都画好,最后用StretchBlt将内存图像复制到屏幕...
  • 曲线拟合的最小二乘法在数据采集中的应用曲线拟合的最小二乘法在数据采集中的应用
  • VC做上位机,实时数据采集以及实时绘制曲线
  • 在VB下设计开发实时的数据采集曲线
  • Delphi环境下控制系统实时数据采集曲线的绘制与打印
  • 根据采集到的数据绘制曲线 在串口编程中会涉及到这样一个问题,就是将采集到的数据曲线的形式展示出来,大家自然而然会想到采用方便快捷的控件进行编程。编程周期短,完成任务快,但是真实情况来看,控件会实现很...

    根据采集到的数据绘制曲线

    在串口编程中会涉及到这样一个问题,就是将采集到的数据以曲线的形式展示出来,大家自然而然会想到采用方便快捷的控件进行编程。编程周期短,完成任务快,但是真实情况来看,控件会实现很多你用不到的功能,实现机制也不可见,这样在功能上会造成浪费,对性能和实现的效果上会有一些不可控,所以在这一类编程中建议自己通过设备上下文自己编写适合自己软件的曲线图。

    我要实现的功能如下图:

     

    这是一个在网上下载的例程运行的效果,我中间采用的编程思想大多来源这里,只是针我要实现的功能进行了修改。因为我的程序现在还没进行设备测试,所以这里借用一下这个效果图。

    将画图实现的功能封装在一个类里面,在需要画图的时候,便可以实例化一个对象。

    下面是详细的实现过程,为防止屏幕闪烁,采用了双缓冲技术。

    实现的过程中主要的两问题是:1、为了绘制速度快,不会因为数据的增加而出现绘制越来越慢,最后卡死的现象,这里采用例程中用的方法,将已经画过的图像保存BitMap 中,来了数据直接在map上绘制,然后再复制在屏幕上。2、我的功能中会根据用户操作改变曲线显示的区域大小,这个时候就需要全部重绘,原来map里的曲线就不能再用了,因为大小已经改变了,这时候在OnPaint函数里面实现的功能就是重新绘制坐标轴框图和根据保存的数据进行曲线的绘制。

    该类的头文件函数:

      1 #pragma once
      2 
      3 
      4 
      5 //用于绘制二维曲线
      6 class CDrawView : public CWnd
      7 {
      8     DECLARE_DYNCREATE(CDrawView)
      9 
     10 public:
     11     CDrawView();        
     12     virtual ~CDrawView();
     13     DECLARE_MESSAGE_MAP()
     14 
     15 public:
     16 #ifdef _DEBUG
     17     virtual void AssertValid() const;
     18 #ifndef _WIN32_WCE
     19     virtual void Dump(CDumpContext& dc) const;
     20 #endif
     21 #endif
     22 
     23 public:
     24 
     25 
     26 
     27     CPoint m_dCurrentPosition;     //current position
     28     CPoint m_dPreviousPosition;     //previous position
     29     double m_updateRate;//数据更新率
     30     void setUpdateRate(double updateRate);
     31 
     32     CList<CPoint,CPoint&> dataList;//用于存储真实数据
     33     CList<CPoint,CPoint&> dataList1;//用于绘图
     34     CList<CPoint,CPoint&> tempDataList;//暂存数据
     35     void InvalidateCtrl();
     36     void SetYRange(double dYLower, double dYUpper, int nYDecimalPlaces);
     37     void SetXRange(int dXLower,int dXUpper,int nXDecimalPlaces);
     38     void SetXUnits(CString string);
     39     void SetYUnits(CString string);
     40     void SetGridColor(COLORREF color);
     41     void SetPlotColor(COLORREF color);
     42     void SetBackgroundColor(COLORREF color);
     43     void SetTitle(CString title);
     44     void AppendPoint(CPoint *newDataList);
     45     void Reset();
     46     void DrawPoint();
     47 
     48     //各个部分的颜色
     49     COLORREF m_crBackColor;     //backGround color
     50     COLORREF m_crGridColor;     //Grid color
     51     COLORREF m_crPlotColor;     //data plot color
     52 
     53     //设备上下文以及与其相关的位图
     54 
     55     CDC m_dcGrid;
     56     CDC m_dcPlot;
     57     CBitmap *m_pBitmapOldGrid;
     58     CBitmap *m_pBitmapOldPlot;
     59     CBitmap m_pBitmapGrid;
     60     CBitmap m_pBitmapPlot;
     61 
     62 
     63     //画图区域相关
     64     int m_nHalfShiftPixels;
     65     int m_nPlotShiftPixels;
     66     int m_nClientHeight;
     67     int m_nClientWidth;
     68     int m_nPlotHeight;
     69     int m_nPlotWidth;
     70 
     71     //坐标轴Y
     72     double m_dYLowerLimit;
     73     double m_dYUpperLimit;
     74     double m_dYRange;
     75     double m_dVerticalFactor;
     76 
     77     //坐标轴X
     78     int m_dXLowerLimit;
     79     int m_dXUpperLimit;
     80     double m_dXRange;
     81     double m_dHorizontalFactor;
     82 
     83     //title
     84     CString m_sTitile;
     85 
     86     CRect m_rectClient;
     87     CRect m_rectPlot;
     88     CPen  m_penPlot;
     89     CBrush m_brushBack;
     90 
     91     int m_nShiftPixels;          //amount  to  shift with each new point 
     92     int m_nYDecimal;
     93     int m_nXDecimal;
     94 
     95     CString m_strXUnitsString;
     96     CString m_strYUnitsString;
     97 
     98 
     99 
    100 
    101     CString str;
    102     CList<int,int>listOfFogX;
    103 
    104     afx_msg void OnPaint();
    105     BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID=NULL);
    106     afx_msg void OnSize(UINT nType, int cx, int cy);
    107 };
    View Code

     

    该类的实现文件内容:

      1 // DrawView.cpp : 实现文件
      2 //
      3 
      4 #include "stdafx.h"
      5 #include "IMU4.h"
      6 #include "DrawView.h"
      7 #include "math.h"
      8 
      9 
     10 // CDrawView
     11 
     12 IMPLEMENT_DYNCREATE(CDrawView, CWnd)
     13 
     14 CDrawView::CDrawView()
     15 {
     16     m_nYDecimal = 3 ;
     17 
     18     m_dPreviousPosition.x = 0;
     19     m_dPreviousPosition.y = 0;
     20 
     21     m_dCurrentPosition.x = 0;
     22     m_dCurrentPosition.y = 0;
     23 
     24     m_dYLowerLimit = -10.0 ;
     25     m_dYUpperLimit =  10.0 ;
     26     m_dYRange =  m_dYUpperLimit - m_dYLowerLimit ;   
     27 
     28     m_dXLowerLimit = 0;
     29     m_dXUpperLimit = 1000;
     30     m_dXRange = m_dXUpperLimit - m_dXLowerLimit;
     31 
     32     m_dVerticalFactor = (double)m_nPlotHeight / m_dYRange ; 
     33     m_dHorizontalFactor = (double)m_nClientWidth / m_dXRange / 100.0;
     34 
     35     m_nShiftPixels     = 4 ;
     36     m_nHalfShiftPixels = m_nShiftPixels/2 ;                     
     37     m_nPlotShiftPixels = m_nShiftPixels + m_nHalfShiftPixels ;  
     38 
     39     m_crBackColor  = RGB(  0,   0,   0) ;  
     40     m_crGridColor  = RGB(  0, 255, 255) ;  
     41     m_crPlotColor  = RGB(255, 255, 255) ;  
     42 
     43     m_penPlot.CreatePen(PS_SOLID, 0, m_crPlotColor) ;
     44     m_brushBack.CreateSolidBrush(m_crBackColor) ;
     45 
     46     m_strXUnitsString.Format(_T("")) ;  
     47     m_strYUnitsString.Format(_T("")) ;  
     48 
     49     m_pBitmapOldGrid = NULL ;
     50 }
     51 
     52 CDrawView::~CDrawView()
     53 {
     54 
     55 }
     56 
     57 
     58 BEGIN_MESSAGE_MAP(CDrawView, CWnd)
     59     ON_WM_MOUSEACTIVATE()
     60     ON_WM_DESTROY()
     61     ON_WM_PAINT()
     62     ON_WM_SIZE()
     63     ON_WM_TIMER()
     64 END_MESSAGE_MAP()
     65 
     66 
     67 
     68 #ifdef _DEBUG
     69 void CDrawView::AssertValid() const
     70 {
     71     CWnd::AssertValid();
     72 }
     73 
     74 #ifndef _WIN32_WCE
     75 void CDrawView::Dump(CDumpContext& dc) const
     76 {
     77     CWnd::Dump(dc);
     78 }
     79 #endif
     80 #endif
     81 void CDrawView::InvalidateCtrl()
     82 {
     83     //用于画坐标轴等信息的函数
     84     int i;
     85     int nCharacters;
     86     int nTopGridPix,nMidGridPix,nBottomGridPix;//分别代表绘图区的三条线(暂定)
     87 
     88     CPen *oldPen;
     89     CPen solidPen(PS_SOLID,0,m_crGridColor);//建立一个画实线的画笔对象
     90     CFont axisFont,yUnitFont,*oldFont;//建立三个字体对象
     91     CString strTemp = _T("0");
     92 
     93     CClientDC dc(this);
     94     if(m_dcGrid.GetSafeHdc() == NULL)
     95     {
     96         m_dcGrid.CreateCompatibleDC(&dc);    
     97         m_pBitmapGrid.CreateCompatibleBitmap(&dc,m_nClientWidth,m_nClientHeight);    
     98         m_pBitmapOldGrid = m_dcGrid.SelectObject(&m_pBitmapGrid);
     99     }
    100     m_dcGrid.SetBkColor(m_crBackColor);
    101     m_dcGrid.FillRect(m_rectClient, &m_brushBack) ;    
    102     nCharacters = max(abs((int)log10(fabs(m_dYUpperLimit))),abs((int)log10(fabs(m_dYLowerLimit))));
    103     nCharacters = nCharacters + 4 + m_nYDecimal;
    104 
    105     m_rectPlot.left = m_rectClient.left + 6 * nCharacters;
    106     m_nPlotWidth = m_rectPlot.Width();
    107 
    108     //draw the plot rectangle
    109     oldPen = m_dcGrid.SelectObject(&solidPen);
    110     m_dcGrid.MoveTo(m_rectPlot.left,m_rectPlot.top);
    111     m_dcGrid.LineTo(m_rectPlot.right + 1,m_rectPlot.top);
    112     m_dcGrid.LineTo(m_rectPlot.right + 1,m_rectPlot.bottom + 1);
    113     m_dcGrid.LineTo(m_rectPlot.left,m_rectPlot.bottom + 1);
    114     m_dcGrid.LineTo(m_rectPlot.left,m_rectPlot.top);
    115 
    116     //draw the dotted lines,
    117     //use setPixel instead of a dotted pen - this allows for a 
    118     //finer  dotted line  and a more "" technical "look
    119     nMidGridPix = (m_rectPlot.top + m_rectPlot.bottom) / 2;
    120     nTopGridPix = nMidGridPix - m_nPlotHeight / 4;
    121     nBottomGridPix = nMidGridPix + m_nPlotHeight / 4;
    122 
    123     for(i = m_rectPlot.left; i < m_rectPlot.right; i+= 4)
    124     {
    125         m_dcGrid.SetPixel(i,nTopGridPix,m_crGridColor);
    126         m_dcGrid.SetPixel(i,nMidGridPix,m_crGridColor);
    127         m_dcGrid.SetPixel(i,nBottomGridPix,m_crGridColor);
    128     }
    129 
    130     //create some fonts (horiaontal  and vertical )
    131     //use a height  of 14 pixels and 300 weight
    132     //(this may need  to be adjusted depending on the display )
    133 
    134     axisFont.CreateFont (14, 0, 0, 0, 300,
    135                        FALSE, FALSE, 0, ANSI_CHARSET,
    136                        OUT_DEFAULT_PRECIS, 
    137                        CLIP_DEFAULT_PRECIS,
    138                        DEFAULT_QUALITY, 
    139                        DEFAULT_PITCH|FF_SWISS, _T("Arial"));
    140     yUnitFont.CreateFont (14, 0, 900, 0, 300,
    141                        FALSE, FALSE, 0, ANSI_CHARSET,
    142                        OUT_DEFAULT_PRECIS, 
    143                        CLIP_DEFAULT_PRECIS,
    144                        DEFAULT_QUALITY, 
    145                        DEFAULT_PITCH|FF_SWISS, _T("Arial")) ;
    146 
    147     //grab the horizontal font
    148     oldFont = m_dcGrid.SelectObject(&axisFont);
    149 
    150     //y max
    151     m_dcGrid.SetTextColor(m_crGridColor);
    152     m_dcGrid.SetTextAlign(TA_RIGHT|TA_TOP);
    153     strTemp.Format (_T("%.*lf"),m_nYDecimal, m_dYUpperLimit) ;//*号会被m_nYDecimals取代,表示保留几位小数
    154     m_dcGrid.TextOutW(m_rectPlot.left - 4,m_rectPlot.top,strTemp);
    155 
    156     m_dcGrid.SetTextAlign (TA_LEFT|TA_TOP) ;
    157     m_dcGrid.TextOut (m_rectPlot.left - 4, m_rectPlot.bottom - (0 - m_dYLowerLimit) * m_dVerticalFactor, _T("0")) ;
    158     //y min 
    159     m_dcGrid.SetTextAlign(TA_RIGHT|TA_BASELINE);
    160     strTemp.Format(_T("%.*lf"),m_nYDecimal,m_dYLowerLimit);
    161     m_dcGrid.TextOutW(m_rectPlot.left - 4,m_rectPlot.bottom,strTemp);
    162 
    163     //x min
    164     m_dcGrid.SetTextAlign (TA_LEFT|TA_TOP) ;
    165     m_dcGrid.TextOut (m_rectPlot.left, m_rectPlot.bottom+4, _T("0")) ;
    166     //横坐标
    167     for(int i = 1;i <= 5;i++)
    168     {
    169         m_dcGrid.SetTextAlign(TA_CENTER|TA_TOP);
    170         strTemp.Format(_T("%d"),m_dXUpperLimit * i / 6);
    171         m_dcGrid.TextOut((m_rectPlot.left + m_nPlotWidth * i / 6),m_rectPlot.bottom + 4, strTemp);
    172     }
    173     // x max
    174      m_dcGrid.SetTextAlign (TA_RIGHT|TA_TOP) ;
    175      strTemp.Format (_T("%d"), m_dXUpperLimit) ; 
    176      m_dcGrid.TextOut (m_rectPlot.right, m_rectPlot.bottom+4, strTemp) ;
    177 
    178      // x units
    179     m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP) ;
    180     m_dcGrid.TextOut (m_rectPlot.right - 70, 
    181                     m_rectPlot.bottom+4, m_strXUnitsString) ;
    182     //title
    183     m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP) ;
    184     m_dcGrid.TextOut ((m_rectPlot.left+m_rectPlot.right)/2, 
    185         m_rectPlot.top-17, m_sTitile) ;
    186 
    187     // restore the font
    188     m_dcGrid.SelectObject(oldFont) ;
    189     // y units
    190     oldFont = m_dcGrid.SelectObject(&yUnitFont) ;
    191     m_dcGrid.SetTextAlign (TA_CENTER|TA_BASELINE) ;
    192     m_dcGrid.TextOut ((m_rectClient.left+m_rectPlot.left)/2, 
    193                     (m_rectPlot.bottom+m_rectPlot.top)/2, m_strYUnitsString) ;
    194     m_dcGrid.SelectObject(oldFont) ;
    195 
    196     //创建画曲线的内存DC和兼容Bitmap
    197     if (m_dcPlot.GetSafeHdc() == NULL)
    198     {
    199         m_dcPlot.CreateCompatibleDC(&dc) ;
    200         m_pBitmapPlot.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;
    201         m_pBitmapOldPlot = m_dcPlot.SelectObject(&m_pBitmapPlot) ;
    202     }
    203     // make sure the plot bitmap is cleared
    204     m_dcPlot.SetBkColor (m_crBackColor) ;
    205     m_dcPlot.FillRect(m_rectClient, &m_brushBack) ;
    206 }
    207 
    208 //set title
    209 void CDrawView::SetTitle(CString title)
    210 {
    211     m_sTitile = title;
    212     InvalidateCtrl();
    213 }
    214 void CDrawView::SetYRange(double dYLower, double dYUpper, int nYDecimalPlaces)
    215 {
    216   ASSERT(dYUpper > dYLower) ;
    217 
    218   m_dYLowerLimit     = dYLower ;
    219   m_dYUpperLimit     = dYUpper ;
    220   m_nYDecimal      = nYDecimalPlaces ;
    221   m_dYRange          = m_dYUpperLimit - m_dYLowerLimit ;
    222   m_dVerticalFactor = (double)m_nPlotHeight / m_dYRange ; 
    223 
    224   InvalidateCtrl() ;
    225 } // SetYRange
    226 
    227 void CDrawView::SetXRange(int dXLower,int dXUpper,int nXDecimalPlaces)
    228 {
    229     ASSERT(dXUpper > dXLower);
    230 
    231     m_dXLowerLimit = dXLower;
    232     m_dXUpperLimit = dXUpper;
    233     m_nXDecimal = nXDecimalPlaces;
    234     m_dXRange = m_dXUpperLimit - m_dXLowerLimit;
    235     m_dHorizontalFactor = (double)m_nPlotWidth / m_dXRange / 400.0 /** (m_updateRate * 400)*/;
    236 
    237     InvalidateCtrl();
    238 }
    239 
    240 void CDrawView::SetXUnits(CString string)
    241 {
    242     m_strXUnitsString = string ;
    243     InvalidateCtrl() ;
    244 
    245 }  // SetXUnits
    246 
    247 
    248 void CDrawView::SetYUnits(CString string)
    249 {
    250     m_strYUnitsString = string ;
    251     InvalidateCtrl() ;
    252 
    253 }  // SetYUnits
    254 
    255 void CDrawView::SetGridColor(COLORREF color)
    256 {
    257     m_crGridColor = color ;
    258     InvalidateCtrl() ;
    259 
    260 }  // SetGridColor
    261 
    262 void CDrawView::SetPlotColor(COLORREF color)
    263 {
    264     m_crPlotColor = color ;
    265 
    266     m_penPlot.DeleteObject() ;
    267     m_penPlot.CreatePen(PS_SOLID, 0, m_crPlotColor) ;
    268     InvalidateCtrl() ;
    269 
    270 }  // SetPlotColor
    271 
    272 void CDrawView::SetBackgroundColor(COLORREF color)
    273 {
    274     m_crBackColor = color ;
    275 
    276     m_brushBack.DeleteObject() ;
    277     m_brushBack.CreateSolidBrush(m_crBackColor) ;
    278     InvalidateCtrl() ;
    279 
    280 }  // SetBackgroundColor
    281 
    282 void CDrawView::AppendPoint(CPoint *newpPoint)
    283 {
    284     //在plotBitmap上继续画刚接收到的一个数据点,如果一次画本次接收到的所有数据,耗时严重,实时性不强
    285     CPoint dPrevious;
    286     
    287     dPrevious = m_dCurrentPosition;
    288     m_dCurrentPosition = *newpPoint;
    289     //根据新来的数据点更新纵坐标
    290     if(m_dCurrentPosition.y < m_dYLowerLimit)
    291     {
    292         m_dYLowerLimit = m_dCurrentPosition.y;
    293     }
    294     if(m_dCurrentPosition.y > m_dYUpperLimit)
    295     {
    296         m_dYUpperLimit = m_dCurrentPosition.y;
    297     }
    298     //将数据保存在链表里用于重绘以及后面的参数计算
    299     dataList.AddTail(m_dCurrentPosition);
    300     //在plotBitmap上接着画当前数据点
    301     DrawPoint();
    302     //在界面上显示出来
    303     //在这里要注意CClientDC和CPaintDC的区别,一定要避免在OnPaint函数里直接或间接的用CClientDC,这样会使界面一直重绘,造成假死现象
    304     if(IsWindow(this->m_hWnd))
    305     {
    306         CClientDC dc(this) ;  // device context for painting
    307         CDC memDC ;            //定义一个内存设备描述表对象(即后备缓冲区)
    308         CBitmap memBitmap ;    //定义一个位图对象
    309         CBitmap* oldBitmap ; // bitmap originally found in CMemDC
    310 
    311         if(dc.GetSafeHdc() != NULL)
    312         {
    313             memDC.CreateCompatibleDC(&dc) ;//建立与屏幕设备描述表(前端缓冲区)兼容的内存设备描述表句柄(后备缓冲区)
    314             memBitmap.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;//建立一个与屏幕设备描述表(或者内存设备描述表)兼容的位图
    315             oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;//只有选入了位图的设备描述表才有地方绘图,画到指定的位图上
    316 
    317             if (memDC.GetSafeHdc() != NULL)
    318             {
    319                 // first drop the grid on the memory dc
    320                 memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, 
    321                          &m_dcGrid, 0, 0, SRCCOPY) ;
    322              // now add the plot on top as a "pattern" via SRCPAINT.
    323              // works well with dark background and a light plot
    324                 memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, 
    325                            &m_dcPlot, 0, 0, SRCPAINT) ;  //SRCPAINT
    326              // finally send the result to the display
    327                 dc.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, 
    328                           &memDC, 0, 0, SRCCOPY) ;
    329             }
    330 
    331             memDC.SelectObject(oldBitmap) ;
    332         }
    333     }
    334 }
    335 //将当前数据点绘制到plotBitmap上    
    336 void CDrawView::DrawPoint()
    337 { 
    338     double currX, prevX, currY, prevY ;
    339 
    340     CPen *oldPen ;
    341     CRect rectCleanUp ;
    342 
    343     if (m_dcPlot.GetSafeHdc() != NULL)
    344     {
    345 
    346         oldPen = m_dcPlot.SelectObject(&m_penPlot) ;
    347      // 移到由prevX和prevY指定的前一个位置
    348         prevX = m_rectPlot.left +  m_dPreviousPosition.x * m_dHorizontalFactor;
    349         prevY = m_rectPlot.bottom - 
    350               (long)((m_dPreviousPosition.y - m_dYLowerLimit) * m_dVerticalFactor);
    351         m_dcPlot.MoveTo (prevX, prevY);
    352 
    353      // 画到当前点的位置
    354         currX = m_rectPlot.left + m_dCurrentPosition.x * m_dHorizontalFactor;
    355         currY = m_rectPlot.bottom - 
    356             (long)((m_dCurrentPosition.y - m_dYLowerLimit) * m_dVerticalFactor);
    357         m_dcPlot.LineTo (currX, currY);
    358 
    359     // restore the pen 
    360         m_dcPlot.SelectObject(oldPen) ;
    361     // store the current point for connection to the next point
    362         m_dPreviousPosition.x = m_dCurrentPosition.x ;
    363         m_dPreviousPosition.y = m_dCurrentPosition.y;
    364   }
    365 
    366 } // end DrawPoint
    367 void CDrawView::OnPaint()
    368 {
    369         if(m_dcGrid.GetSafeHdc() != NULL)
    370         {
    371             m_dcGrid.DeleteDC();
    372             m_pBitmapGrid.DeleteObject();
    373         }
    374         if(m_dcPlot.GetSafeHdc() != NULL)
    375         {
    376             m_dcPlot.DeleteDC();
    377             m_pBitmapPlot.DeleteObject();
    378         }
    379             
    380     InvalidateCtrl();
    381 
    382     double pointX,pointY;
    383     CPoint tempPoint;
    384     CPen *oldPen1 ;
    385     //dataList1.RemoveAll();
    386     if(dataList.GetCount() > 1)
    387     {
    388         //绘图区域大小已经改变,需要重绘
    389         if(m_dcPlot.GetSafeHdc() != NULL )
    390         {
    391             oldPen1 = m_dcPlot.SelectObject(&m_penPlot) ;
    392             POSITION pos1 = dataList.GetHeadPosition();
    393             
    394             tempPoint = dataList.GetNext(pos1);
    395             pointX = m_rectPlot.left + tempPoint.x * m_dHorizontalFactor;
    396             pointY = m_rectPlot.bottom - 
    397                 (long)((tempPoint.y - m_dYLowerLimit) * m_dVerticalFactor);
    398             m_dcPlot.MoveTo(pointX,pointY);
    399             CString str;
    400             str.Format(_T("long is %d"),dataList.GetCount());
    401             //TRACE(str);
    402             for(int i = 1; i < dataList.GetCount();i++ )
    403             {
    404                 tempPoint = dataList.GetNext(pos1);
    405                 pointX = m_rectPlot.left + tempPoint.x * m_dHorizontalFactor;
    406                 pointY = m_rectPlot.bottom - 
    407                 (long)((tempPoint.y - m_dYLowerLimit) * m_dVerticalFactor);
    408                 m_dcPlot.LineTo(pointX,pointY);
    409                 m_dcPlot.MoveTo(pointX,pointY);
    410             }
    411             m_dcPlot.SelectObject(oldPen1);
    412         }
    413     }
    414 
    415 
    416     if(m_nClientHeight != 0)
    417     {
    418         CPaintDC dc(this) ;  // device context for painting
    419     
    420         CDC memDC ;            //定义一个内存设备描述表对象(即后备缓冲区)
    421         CBitmap memBitmap ;    //定义一个位图对象
    422         CBitmap* oldBitmap ; // bitmap originally found in CMemDC
    423 
    424         memDC.CreateCompatibleDC(&dc) ;//建立与屏幕设备描述表(前端缓冲区)兼容的内存设备描述表句柄(后备缓冲区)
    425         memBitmap.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;//建立一个与屏幕设备描述表(或者内存设备描述表)兼容的位图
    426         oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;//只有选入了位图的设备描述表才有地方绘图,画到指定的位图上
    427     
    428         if (memDC.GetSafeHdc() != NULL)
    429         {
    430             
    431              //first drop the grid on the memory dc
    432             memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, 
    433                  &m_dcGrid, 0, 0, SRCCOPY) ;
    434              // now add the plot on top as a "pattern" via SRCPAINT.
    435          // works well with dark background and a light plot
    436     
    437             memDC.BitBlt(0, 0, m_nPlotWidth, m_nPlotHeight, 
    438                    &m_dcPlot, 0, 0, SRCPAINT) ;  //SRCPAINT
    439           //finally send the result to the display    
    440             dc.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, 
    441                   &memDC, 0, 0, SRCCOPY) ;
    442             
    443         }
    444 
    445         memDC.SelectObject(oldBitmap) ;
    446         memDC.DeleteDC();
    447         memBitmap.DeleteObject();
    448     }    
    449 }
    450 
    451 
    452 void CDrawView::Reset()
    453 {
    454   InvalidateCtrl() ;
    455 }        
    456 
    457 
    458 BOOL CDrawView::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
    459 {
    460     // TODO: 在此添加专用代码和/或调用基类
    461     BOOL result;
    462     static CString className = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW);//注册窗口类,返回值包含创建的窗口类的信息
    463     result = CWnd::CreateEx(WS_EX_CLIENTEDGE | WS_EX_STATICEDGE, 
    464                           className, NULL, dwStyle, 
    465                           rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
    466                           pParentWnd->GetSafeHwnd(), (HMENU)nID) ;
    467     m_dPreviousPosition.x = 0;
    468     m_dPreviousPosition.y = 0;
    469 
    470     m_dCurrentPosition.x = 0;
    471     m_dCurrentPosition.y = 0;
    472     if (result != 0)
    473         // InvalidateCtrl() ;
    474     
    475     return result ;
    476 }
    477 
    478 
    479 void CDrawView::OnSize(UINT nType, int cx, int cy)
    480 {
    481     CWnd::OnSize(nType, cx, cy);
    482 
    483     GetClientRect(&m_rectClient) ;
    484     // set some member variables to avoid multiple function calls
    485     m_nClientHeight = m_rectClient.Height() ;
    486     m_nClientWidth  = m_rectClient.Width() ;
    487     // the "left" coordinate and "width" will be modified in 
    488     // InvalidateCtrl to be based on the width of the y axis scaling
    489     m_rectPlot.left   = 20 ;  
    490     m_rectPlot.top    = 25;
    491     m_rectPlot.right  = m_rectClient.right-10 ;
    492     m_rectPlot.bottom = m_rectClient.bottom-25 ;
    493 
    494     // set some member variables to avoid multiple function calls
    495     m_nPlotHeight = m_rectPlot.Height() ;
    496     m_nPlotWidth  = m_rectPlot.Width() ;
    497 
    498     // set the scaling factor for now, this can be adjusted 
    499     // in the SetRange functions
    500     m_dVerticalFactor = (double)m_nPlotHeight / m_dYRange ; 
    501     m_dHorizontalFactor = (double)m_nClientWidth / m_dXRange /400.0 /** (m_updateRate * 400)*/;
    502     
    503 }
    504 void CDrawView::setUpdateRate(double updateRate)
    505 {
    506     m_updateRate = updateRate;
    507 }
    View Code

     

    转载于:https://www.cnblogs.com/ling123/p/7029094.html

    展开全文
  • 介绍在windows 98/2000环境下,如何利用VC++6.0通过microsoft公司提供的MSComm通讯控件、MSChart图 表控件来实现串口实时数据采集、实时曲线绘制以及曲线满屏处理,并给出相应的数据处理程序。
  • 应用VB环境,画动态曲线,适用于实施数据采集
  • 全日制普通本科生毕业设计 基于MATLA实时串口数据采集曲线显示 REAL-TIME SERIAL DATA ACQUISITION AND FIGURE SHOW BASED ON MATLAB 学生姓名 学 号 年级专业及班级 指导老师及职称 学 院 提交日期 2011年 5月 全...
  • 注意:接收的16进制要符合一定格式,才能读取显示,具体见程序 分了五个.m文件(一个主函数,四个子函数): main: %% clc; clear; global t1; global t2; global t3; global t4;...globa...

    注意:接收的16进制要符合一定格式,才能读取显示,具体见程序

    分了五个.m文件(一个主函数,四个子函数):

    main:

    
    %%
    clc;
    clear; 
    global t1;
    global t2;
    global t3;
    global t4;
    global m1;
    global m2;
    global m31;
    global m32;
    global m41;
    global m42;
    global ii1;
    global ii2;
    global ii3;
    global ii4; 
    
    t1=[0],t2=[0],t3=[0],t4=[0];
    m1=[0],m2=[0],m31=[0],m32=[0],m41=[0],m42=[0];
    ii1=[0],ii2=[0],ii3=[0],ii4=[0];
    
    subplot(2,2,1);
    p1 = plot(t1,m1);
    ylabel('ref1');
    grid on;
    subplot(2,2,2);
    p2=plot(t2,m2);
    ylabel('ref2')
    grid on;
    subplot(2,2,3);
    p31=plot(t3,m31);
    hold on
    p32=plot(t3,m32);
    ylabel('test1');
    grid on;
    subplot(2,2,4);
    p41=plot(t4,m41);
    hold on;
    p42=plot(t4,m42);
    ylabel('test2');
    %axis([x-200 x+200 0 200]);
    grid on;
     
    %%
     
    %try
    %    s7=serial('com7');
    %catch
    %    error('cant serial');
    %end
    s1=serial('com16');
    s2=serial('com17');
    s3=serial('com10');
    s4=serial('com14');
    set(s1,'BaudRate', 9600,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none','TimeOut',1,'BytesAvailableFcn',{@callback1,p1},'BytesAvailableFcnMode', 'byte','BytesAvailableFcnCount',10);
    set(s2,'BaudRate', 9600,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none','TimeOut',1,'BytesAvailableFcn',{@callback2,p2},'BytesAvailableFcnMode', 'byte','BytesAvailableFcnCount',10);
    set(s3,'BaudRate', 9600,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none','TimeOut',1,'BytesAvailableFcn',{@callback3,p31,p32},'BytesAvailableFcnMode', 'byte','BytesAvailableFcnCount',10);
    set(s4,'BaudRate', 9600,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none','TimeOut',1,'BytesAvailableFcn',{@callback4,p41,p42},'BytesAvailableFcnMode', 'byte','BytesAvailableFcnCount',10);
    
    %set(s, 'BytesAvailableFcn', {'instrcallback'});
    %s.BytesAvailableFcnMode = 'terminator';
    %set(s, 'TimeOut', 1);
    %set(s, 'BytesAvailableFcnCount', 32);
    %s7.BytesAvailableFcn = {@callback7,p7};
    %set(s, 'BytesAvailableFcnMode', 'byte'); 
    % fopen(s1);
    % fopen(s2);
    fopen(s3);
    fopen(s4); 
    pause;
    %test file name defination
    name_ref1=['ref1',datestr(now,30),'.txt'];
    name_ref2=['ref2',datestr(now,30),'.txt'];
    name_test11=['pm11',datestr(now,30),'.txt'];
    name_test12=['pm12',datestr(now,30),'.txt'];
    name_test21=['pm21',datestr(now,30),'.txt'];
    name_test22=['pm22',datestr(now,30),'.txt'];
    %end test file name definataion
    % open file
    fid_ref1=fopen(name_ref1,'w');
    fid_ref2=fopen(name_ref2,'w');
    fid_test11=fopen(name_test11,'w');
    fid_test12=fopen(name_test12,'w');
    fid_test21=fopen(name_test21,'w');
    fid_test22=fopen(name_test22,'w');
    % end open file
    %wtire file
    fprintf(fid_ref1,'%d\r\n',m1);
    fprintf(fid_ref2,'%d\r\n',m2);
    fprintf(fid_test11,'%d\r\n',m31);
    fprintf(fid_test12,'%d\r\n',m32);
    fprintf(fid_test21,'%d\r\n',m41);
    fprintf(fid_test22,'%d\r\n',m42);
    %end write file
    %close file
    fclose(fid_ref1);
    fclose(fid_ref2);
    fclose(fid_test11);
    fclose(fid_test12);
    fclose(fid_test21);
    fclose(fid_test22);
    %end close file
    fclose(s1);
    fclose(s2);
    fclose(s3);
    fclose(s4);
    
    close all;
    

    sub1:

    %%
    function callback1(s1,BytesAvailable,p1)
        
        global t1;
     %   global x;
        global m1;
        global ii1;
     
    %    out = fscanf(s);
    %    data = str2num(out)
         out=fread(s1,10);
    	 data1=out(6)*2^8+out(5);
        
        t1 = [t1 ii1];
        m1 = [m1 data1];
    %    set(p, 'XData',t,'YData',m(1,:));
        set(p1, 'XData',t1,'YData',m1);    
        drawnow
    %    x = x + 1;
    %    axis([x-200 x+200 0 200]);
        ii1=ii1+1;
    end

    sub2:

    %%
    function callback2(s2,BytesAvailable,p2)
        
        global t2;
     %   global x;
        global m2;
        global ii2;
     
    %    out = fscanf(s);
    %    data = str2num(out)
         out=fread(s2,10);
    	 data2=out(6)*2^8+out(5);
         
        
        t2 = [t2 ii2];
        m2 = [m2 data2];
    %    set(p, 'XData',t,'YData',m(1,:));
        set(p2, 'XData',t2,'YData',m2);    
        drawnow
    %    x = x + 1;
    %    axis([x-200 x+200 0 200]);
        ii2=ii2+1;
    end

    sub3:

    %%
    function callback3(s3,BytesAvailable,p31,p32)
        
        global t3;
     %   global x;
        global m31;
        global m32;
        global ii3;
     
    %    out = fscanf(s);
    %    data = str2num(out)
         out=fread(s3,10);
    	 data31=out(3)*2^24+out(4)*2^16+out(5)*2^8+out(6);
     	 data32=out(7)*2^24+out(8)*2^16+out(9)*2^8+out(10);   
        t3 = [t3 ii3];
        m31 = [m31 data31];
        m32 = [m32 data32];
    %    set(p, 'XData',t,'YData',m(1,:));
        set(p31,'XData',t3,'YData',m31);
        set(p32,'XData',t3,'YData',m32);
        drawnow
    %    x = x + 1;
    %    axis([x-200 x+200 0 200]);
        ii3=ii3+1;
    end

    sub4:

    %%
    function callback4(s4,BytesAvailable,p41,p42)
        
        global t4;
     %   global x;
        global m41;
        global m42;
        global ii4;
     
    %    out = fscanf(s);
    %    data = str2num(out)
         out=fread(s4,10);
    	 data41=out(3)*2^24+out(4)*2^16+out(5)*2^8+out(6);
    	 data42=out(7)*2^24+out(8)*2^16+out(9)*2^8+out(10);    
        t4 = [t4 ii4];
        m41 = [m41 data41];
        m42 = [m42 data42];
    %    set(p, 'XData',t,'YData',m(1,:));
        set(p41, 'XData',t4,'YData',m41);
        set(p42,'XData',t4,'YData',m42);
        drawnow
    %    x = x + 1;
    %    axis([x-200 x+200 0 200]);
        ii4=ii4+1;
    end

    源文件见https://download.csdn.net/download/fei_yang_yf/10849236

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 981
精华内容 392
关键字:

曲线采集数据