求助大神们帮忙改改程序?

zaosuo1813 2017-05-12 09:24:13
我想做一个串口通信然后将串口输出的数据绘制成实时曲线 现在小弟完成串口和绘制曲线 ,但只能绘制一个点的,不知道怎么才能绘制出多个点一起显示的呢求大神吗帮帮忙!!!
这是小弟的程序 有么有大神能帮忙改下
void CCommTestDlg::OnOnCommMscomm1() 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_Comm1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_Comm1.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
{ safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
// for(k=0;k<len;k++) //将数组转换为Cstring型变量

BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_EditRxData+=strtemp; //加入接收编辑框对应字符串
// a=atoi(strtemp);
// int a=120;
show=atoi(m_EditRxData);
OnPaint();

}
UpdateData(FALSE); //更新编辑框内容
// SetDlgItemText(IDC_EditRxData,m_EditRxData);//不使用UpdateData(FALSE);的原因是该函数会
//刷新整个对话框的数据,而SetDlgItemText()
//只更新接收编辑框的数据。
}




}
void CCommTestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
CFont font;
font.CreateFont(13,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,NULL);
CWnd *pWnd=GetDlgItem(IDC_STATIC_T);
pWnd->Invalidate();
pWnd->UpdateWindow();
CFont *pOldFont;
CDC *pDC = pWnd->GetDC();
pDC->Rectangle(0, 0,310,310);

pOldFont=pDC->SelectObject(&font); //换字体

pDC->TextOut(2,2,"曲线");

CPen *pPenRed = new CPen(); //创建画笔对象
CPen *pPenBlack=new CPen;
pPenBlack->CreatePen(PS_DOT,1,RGB(0,0,0));
pPenRed ->CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); //红色画笔
//选中当前红色画笔,并保存以前的画笔
CGdiObject *pOldPen = pDC ->SelectObject(pPenRed);




int a=40;

pDC ->MoveTo(20, 20); //绘制坐标轴
pDC ->LineTo(20, 290); //竖起轴
pDC ->LineTo(290,290); //水平轴

pDC->MoveTo(17,24);
pDC->LineTo(20,20);
pDC->LineTo(23,24);
pDC->MoveTo(286,287);
pDC->LineTo(290,290);
pDC->LineTo(286,293);

pDC->TextOut(27,20,"y");
pDC->TextOut(150,292,"x");
pDC->TextOut(7,50+0*40-5,"30");
pDC->TextOut(7,50+1*40-5,"25");
pDC->TextOut(7,50+2*40-5,"20");
pDC->TextOut(7,50+3*40-5,"15");
pDC->TextOut(7,50+4*40-5,"10");
pDC->TextOut(7,50+5*40-5,"5");
pDC->TextOut(7,50+6*40-5,"0");
pDC->MoveTo(20,290);
for(a=40;a<=300;a=a+20)

pDC->LineTo(a,show);
pDC->MoveTo(a+20,290);

}
...全文
296 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zaosuo1813 2017-06-03
  • 打赏
  • 举报
回复
// CommTestDlg.cpp : implementation file // #include "stdafx.h" #include "CommTest.h" #include "CommTestDlg.h" #include ".\TeeChart\series.h" #include ".\TeeChart\axes.h" #include ".\TeeChart\axis.h" #include ".\TeeChart\pen.h" #include ".\TeeChart\teefont.h" #include ".\TeeChart\aspect.h" #include ".\TeeChart\titles.h" #include ".\TeeChart\strings.h" #include ".\TeeChart\legend.h" #include ".\TeeChart\lineseries.h" #include ".\TeeChart\zoom.h" #include ".\TeeChart\scroll.h" #include ".\TeeChart\teeshapepanel.h" #include ".\TeeChart\tools.h" #include ".\TeeChart\toollist.h" #include ".\TeeChart\annotationtool.h" #include ".\TeeChart\TeeChartDefines.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA /////////////////////////////////////////////////////////////////////// // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCommTestDlg dialog CCommTestDlg::CCommTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CCommTestDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCommTestDlg) m_EditRxData = _T(""); m_EditTxData = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_nCount = 0; } void CCommTestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCommTestDlg) DDX_Control(pDX, IDC_BtnSend, m_BthSend); DDX_Control(pDX, IDC_BtnOpen, m_BtnOpen); DDX_Text(pDX, IDC_EditRxData, m_EditRxData); DDX_Text(pDX, IDC_EditTxData, m_EditTxData); DDX_Control(pDX, IDC_MSCOMM1, m_Comm1); DDX_Control(pDX, IDC_TCHART_CT, m_Chart); //DDX_Control(pDX, IDC_MSCHART, m_MSCHART); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCommTestDlg, CDialog) //{{AFX_MSG_MAP(CCommTestDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BtnOpen, OnBtnOpen) ON_BN_CLICKED(IDC_BtnSend, OnBtnSend) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCommTestDlg message handlers BOOL CCommTestDlg::OnInitDialog() { CDialog::OnInitDialog(); //int show; // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here // 重置画图控件 this->Reset(); return TRUE; // return TRUE unless you set the focus to a control } void CCommTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CCommTestDlg::OnOnCommMscomm1() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_Comm1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_Comm1.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++) { safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 // for(k=0;k<len;k++) //将数组转换为Cstring型变量 BYTE bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_EditRxData+=strtemp; //加入接收编辑框对应字符串 // a=atoi(strtemp); //show=atoi(m_EditRxData); show=atoi(strtemp); // 向绘图控件添加一个点数据 m_Chart.Series(0).AddXY(m_nCount, show, "", RGB(255,0,0)); m_nCount++; Invalidate(); } UpdateData(false); //更新编辑框内容 // SetDlgItemText(IDC_EditRxData,m_EditRxData);//不使用UpdateData(FALSE);的原因是该函数会 //刷新整个对话框的数据,而SetDlgItemText() //只更新接收编辑框的数据。 } } void CCommTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } CFont font; font.CreateFont(13,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,NULL); CWnd *pWnd=GetDlgItem(IDC_STATIC_T); pWnd->Invalidate(); pWnd->UpdateWindow(); CFont *pOldFont; CDC *pDC = pWnd->GetDC(); pDC->Rectangle(0, 0,310,310); pOldFont=pDC->SelectObject(&font); //换字体 pDC->TextOut(2,2,"曲线"); CPen *pPenRed = new CPen(); //创建画笔对象 CPen *pPenBlack=new CPen; pPenBlack->CreatePen(PS_DOT,1,RGB(0,0,0)); pPenRed ->CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); //红色画笔 //选中当前红色画笔,并保存以前的画笔 CGdiObject *pOldPen = pDC ->SelectObject(pPenRed); pDC ->MoveTo(20, 20); //绘制坐标轴 pDC ->LineTo(20, 290); //竖起轴 pDC ->LineTo(290,290); //水平轴 pDC->MoveTo(17,24); pDC->LineTo(20,20); pDC->LineTo(23,24); pDC->MoveTo(286,287); pDC->LineTo(290,290); pDC->LineTo(286,293); pDC->TextOut(27,20,"y"); pDC->TextOut(150,292,"x"); pDC->TextOut(7,50+0*40-5,"30"); pDC->TextOut(7,50+1*40-5,"25"); pDC->TextOut(7,50+2*40-5,"20"); pDC->TextOut(7,50+3*40-5,"15"); pDC->TextOut(7,50+4*40-5,"10"); pDC->TextOut(7,50+5*40-5,"5"); pDC->TextOut(7,50+6*40-5,"0"); pDC->MoveTo(20,290); pDC->MoveTo(20,290); for(int x=40;x<=300;x+=20) { pDC->LineTo(x,show); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CCommTestDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } BOOL CCommTestDlg::Reset() { //重置chart m_Chart.ClearChart(); m_Chart.RemoveAllSeries(); m_Chart.GetAspect().SetView3D(FALSE); m_Chart.GetFrame().SetVisible(false); m_Chart.GetZoom().SetEnable(FALSE); m_Chart.GetScroll().SetEnable(pmNone); m_Chart.GetLegend().SetVisible(false); m_Chart.GetAxis().GetLeft().SetAutomatic(TRUE); // 添加曲线 m_Chart.AddSeries(scLine); m_Chart.Series(0).SetColor(RGB(255,0,0)); m_Chart.Series(0).SetVerticalAxis(0); m_Chart.Series(0).SetHorizontalAxis(1); m_Chart.Series(0).GetAsLine().GetLinePen().SetWidth(2); m_Chart.Series(0).SetName("曲线"); return TRUE; } BEGIN_EVENTSINK_MAP(CCommTestDlg, CDialog) //{{AFX_EVENTSINK_MAP(CCommTestDlg) ON_EVENT(CCommTestDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE) //ON_EVENT(CCommTestDlg, IDC_MSCHART, 1550 /* OLEStartDrag */, OnOLEStartDragMschart, VTS_PDISPATCH VTS_PI4) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() void CCommTestDlg::OnBtnOpen() { // TODO: Add your control notification handler code here if(m_Comm1.GetPortOpen()) m_Comm1.SetPortOpen(FALSE); m_Comm1.SetCommPort(1); //选择com1,可根据具体情况更改 m_Comm1.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes m_Comm1.SetOutBufferSize(1024); //设置输入缓冲区的大小,Bytes// m_Comm1.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位 m_Comm1.SetInputMode(1); //1:表示以二进制方式检取数据 m_Comm1.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_Comm1.SetInputLen(0); //设置当前接收区数据长度为0 if( !m_Comm1.GetPortOpen()) m_Comm1.SetPortOpen(TRUE);//打开串口 else AfxMessageBox("cannot open serial port"); m_Comm1.GetInput();//先预读缓冲区以清除残留数据 UpdateData(false); } void CCommTestDlg::OnBtnSend() { // TODO: Add your control notification handler code here UpdateData(TRUE); //读取编辑框内容 m_Comm1.SetOutput(COleVariant(m_EditTxData));//发送数据 } // // void CCommTestDlg::OnOLEStartDragMschart(LPDISPATCH FAR* Data, long FAR* AllowedEffects) // { // // // TODO: Add your control notification handler code here // // }
schlafenhamster 2017-05-26
  • 打赏
  • 举报
回复
从你的 CCommTestDlg::OnOnCommMscomm1() 看 你是要 串口接受到一个数据,界面就 更新一次,但是 串口 的 数据 来的 很快(9600 时1秒 10个字节,2个 int),所以除非 串口 数据 很少,这种 方案 不可取。而且发生 重绘时 只有一个 show 可绘。 通常 串口数据 总是 要 缓冲的。串口 缓冲 可以 用循环 队列,有 1K字节 字节(256个int)就够了。
zaosuo1813 2017-05-25
  • 打赏
  • 举报
回复
那我是把串口的数据放到数组里 可以么 然后在用数组里画出曲线
schlafenhamster 2017-05-25
  • 打赏
  • 举报
回复
对话框 h 中 加入: int m_Show[1000]; int m_IndexNow; 构造函数中 m_IndexNow=0; // a=atoi(strtemp); m_Show[m_IndexNow]=atoi(strtemp); m_IndexNow ++;
monahans 2017-05-25
  • 打赏
  • 举报
回复
你的j没有看到j的处理
zaosuo1813 2017-05-25
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
就是 show【m_index】=atoi(m_EditRxData); m_index ++; // 不要 OnPaint(); } // 不要 UpdateData(FALSE); //更新编辑框内容
他显示 m_index是未定义的
zaosuo1813 2017-05-25
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
我这是用随机数 代替 show【】了 串口每次只输出一个数据 然后数据就应该赋予show【第n个】,等到 n 足够时 (如 20个)就显示
public: CCommTestDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CCommTestDlg) enum { IDD = IDD_COMMTEST_DIALOG }; CButton m_BthSend; CButton m_BtnOpen; CString m_EditRxData; CString m_EditTxData; CMSComm m_Comm1; CMSChart m_MSCHART; int show[10]; int j;///////////////////////////////jiao //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CCommTestDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL 这是我定义的全局变量
schlafenhamster 2017-05-25
  • 打赏
  • 举报
回复
就是 show【m_index】=atoi(m_EditRxData); m_index ++; // 不要 OnPaint(); } // 不要 UpdateData(FALSE); //更新编辑框内容
zaosuo1813 2017-05-25
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
我这是用随机数 代替 show【】了 串口每次只输出一个数据 然后数据就应该赋予show【第n个】,等到 n 足够时 (如 20个)就显示
void CCommTestDlg::OnOnCommMscomm1() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_Comm1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_Comm1.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++) { safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 // for(k=0;k<len;k++) //将数组转换为Cstring型变量 BYTE bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_EditRxData+=strtemp; //加入接收编辑框对应字符串 // a=atoi(strtemp); show[j]=atoi(m_EditRxData); Invalidate(); } UpdateData(false); //更新编辑框内容 // SetDlgItemText(IDC_EditRxData,m_EditRxData);//不使用UpdateData(FALSE);的原因是该函数会 //刷新整个对话框的数据,而SetDlgItemText() //只更新接收编辑框的数据。 } } void CCommTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } CFont font; font.CreateFont(13,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,NULL); CWnd *pWnd=GetDlgItem(IDC_STATIC_T); pWnd->Invalidate(); pWnd->UpdateWindow(); CFont *pOldFont; CDC *pDC = pWnd->GetDC(); pDC->Rectangle(0, 0,310,310); pOldFont=pDC->SelectObject(&font); //换字体 pDC->TextOut(2,2,"曲线"); CPen *pPenRed = new CPen(); //创建画笔对象 CPen *pPenBlack=new CPen; pPenBlack->CreatePen(PS_DOT,1,RGB(0,0,0)); pPenRed ->CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); //红色画笔 //选中当前红色画笔,并保存以前的画笔 CGdiObject *pOldPen = pDC ->SelectObject(pPenRed); pDC ->MoveTo(20, 20); //绘制坐标轴 pDC ->LineTo(20, 290); //竖起轴 pDC ->LineTo(290,290); //水平轴 pDC->MoveTo(17,24); pDC->LineTo(20,20); pDC->LineTo(23,24); pDC->MoveTo(286,287); pDC->LineTo(290,290); pDC->LineTo(286,293); pDC->TextOut(27,20,"y"); pDC->TextOut(150,292,"x"); pDC->TextOut(7,50+0*40-5,"30"); pDC->TextOut(7,50+1*40-5,"25"); pDC->TextOut(7,50+2*40-5,"20"); pDC->TextOut(7,50+3*40-5,"15"); pDC->TextOut(7,50+4*40-5,"10"); pDC->TextOut(7,50+5*40-5,"5"); pDC->TextOut(7,50+6*40-5,"0"); pDC->MoveTo(20,290); pDC->MoveTo(20,290); for(int x=40;x<=300;x+=20) { pDC->LineTo(x,show); } } 改完就这样
schlafenhamster 2017-05-25
  • 打赏
  • 举报
回复
我这是用随机数 代替 show【】了 串口每次只输出一个数据 然后数据就应该赋予show【第n个】,等到 n 足够时 (如 20个)就显示
zaosuo1813 2017-05-25
  • 打赏
  • 举报
回复
pDC->MoveTo(20,290); for(int x=40;x<=300;x+=20) { int show=atoi(m_EditRxData); pDC->LineTo(x,show); } 我按那个大神写的弄了一下 ,结果还是不行。串口每次只输出一个数据 然后数据就被赋予show了 就只能画出一条斜线 ,
zaosuo1813 2017-05-25
  • 打赏
  • 举报
回复
就还是有那个问题啊 我的show 只能显示一个输出值啊 不能像楼上那样显示好多点 有没有大神帮帮忙啊
schlafenhamster 2017-05-25
  • 打赏
  • 举报
回复
pen dc 没 释放 !
schlafenhamster 2017-05-25
  • 打赏
  • 举报
回复

CDialog::OnPaint();
}
CWnd *pWnd=GetDlgItem(IDC_STATIC_T);
// need not ! pWnd->Invalidate(); draw on IDC_STATIC_T !
pWnd->UpdateWindow();
//
CFont font;
font.CreateFont(13,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,NULL);
CFont *pOldFont;
CDC *pDC = pWnd->GetDC();
pDC->Rectangle(0, 0,310,310);
// 换字体
pOldFont=pDC->SelectObject(&font);
//
pDC->TextOut(2,2,"曲线");
//
CPen *pPenRed = new CPen(); //创建画笔对象
CPen *pPenBlack=new CPen;
pPenBlack->CreatePen(PS_DOT,1,RGB(0,0,0));
pPenRed ->CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); //红色画笔
//选中当前红色画笔,并保存以前的画笔
CGdiObject *pOldPen = pDC ->SelectObject(pPenRed);

pDC ->MoveTo(20, 20); //绘制坐标轴
pDC ->LineTo(20, 290); //竖起轴 y
pDC ->LineTo(290,290); //水平轴 x
// y arrow
pDC->MoveTo(17,24);
pDC->LineTo(20,20);
pDC->LineTo(23,24);
// x arrow
pDC->MoveTo(286,287);
pDC->LineTo(290,290);
pDC->LineTo(286,293);
// y scaler
pDC->TextOut(27,20,"y");
pDC->TextOut(150,292,"x");
pDC->TextOut(7,50+0*40-5,"30");
pDC->TextOut(7,50+1*40-5,"25");
pDC->TextOut(7,50+2*40-5,"20");
pDC->TextOut(7,50+3*40-5,"15");
pDC->TextOut(7,50+4*40-5,"10");
pDC->TextOut(7,50+5*40-5,"5");
pDC->TextOut(7,50+6*40-5,"0");
pDC->MoveTo(20,290);
//
srand(1);
// 1st point
pDC->MoveTo(20,290);
// others
for(int x=40;x<=300;x+=20)
{
int show = rand() % 300;// actual show[] from comm.
pDC->LineTo(x,show);
}


zaosuo1813 2017-05-25
  • 打赏
  • 举报
回复
我定了全局变量int show[1000]; 然后在串口程序中写了 j=1; show[j]=atoi(m_EditRxData); j++; OnPaint; 在onpaint中写 Moveto(20,290); Lineto(20,show[j]); 编译没有问题,可是执行的时候就会出现问题
zaosuo1813 2017-05-25
  • 打赏
  • 举报
回复
您好,我现在把数据放到了show【1000】里面 ,画图的时候却不能直接把show【1】用move to line to 画出来,有点不会
schlafenhamster 2017-05-25
  • 打赏
  • 举报
回复
串口的数据放到数组show [ ]里,这是 y轴, X轴是 time
xinhaoda 2017-05-22
  • 打赏
  • 举报
回复
你这个实现有问题。 1 你的坐标轴X,y只需绘一次就行了,如你所写每次收到数据都会重绘坐标轴。 2 从串口接收的数据,先缓存到一个容器中,调用绘制区域的InvailtRect,使Opain重绘就行了。你在串口接收中掉了2次,多了
schlafenhamster 2017-05-13
  • 打赏
  • 举报
回复
要把 当时 的 数据 存入 一个数组, int shou 【1000】
三岁、就很帅 2017-05-13
  • 打赏
  • 举报
回复
引用 5 楼 zaosuo1813 的回复:
就是我把串口输出数据放到show上,但是串口数据一变化show也跟着变化,它就只能画出一条曲线,就是当前的show值,并不能画出整个变化的过程,就是好多个show值一起在曲线上显示
你把数据保存到链表里面 每次来数据了 更新下 重头到脚再全部绘制啊
加载更多回复(5)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧