1.串口读来的是字符,转化成数字?
  2.读串口缓冲区,需要一个数组记录读到的每个数据,这个数组放在view类 还是doc类中?
  3.我在对话框中绘图,如何能让对话框类使用我得到的数组?

解决方案 »

  1.   

    1,是要转换
    2,在App中吧
    3,theApp.数组
      

  2.   

    多谢 。 但是我在doc中进行的串口通信设置,在view中定义的线程。如果在app中放置数组能不能引用doc中的 readfile()函数呢?
      

  3.   

    搞了一整天了 还是不行  恳请高手帮忙。
    1.在view类OnTimer()中实现绘图 ,但是接不到数据
       void CTTYView::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    CCDrawRate dlg1;
        CTTYDoc* pDoc=GetDocument(); pDoc->getxdata ();
    pDoc->getydata ();
    if(dlg1.DoModal ()==IDOK)
    {
    if(r>99)
    {
    r=0;
    Invalidate();
    }

    dlg1.DrawPoint (pDoc->xaxis[r],pDoc->data1[r]);
    r++; }
    CEditView::OnTimer(nIDEvent);
    }
    我在线程中设置了SetTimer(1,1000,NULL)。2.我在DOC类中进行数据操作
        void CTTYDoc::getydata ()
    {
             int j;
     int jlength;
     int nLength;
     j=0;
     char data[10];
     char buf[MAXBLOCK/4];
     nLength=ReadComm(buf,100);
            for(int l=0;l<nLength;l++)
    {
    if(47<buf[l]&&buf[l]<58)
    data[j]=buf[l];
    j++;
    jlength=j-1; }
    for (int k;k<jlength+1;k+=4)
    {
    data1[m]=(data[k]-'0')*10+(data[k+1]-'0')+(data[k+2]-'0')*0.1+(data[k+3]-'0')*0.01;
    m++;
    }}
    void CTTYDoc::getxdata()
    {
    for (int i=0;i<100;i++)
    xaxis[i]=5+i*4;
    }3.为什么不能接受数据,我还有哪里没考虑到?
      

  4.   

    1:字符转数字,比如char*转int,可用atoi
    2:如果这个数据在多个类的用到可以设置成全局变量,放到APP中也可以,因为在任何类中都可以用AfxGetApp()访问这个数据。
    3:这个方法就多了,可以全局访问,可以把数组作为参数传进来
    LZ给的代码是绘图部分的,跟为什么不能接受数据有什么关系?断点调试下数据的流向,看到哪一部分就丢失了。
      

  5.   

        nLength=ReadComm(buf,100); 这一句是读串口数据。
        
      

  6.   

    返回值应该就是读出来的数据长度把,那你看这个长度对不对,是不是为0,数据应该是存在buf里把,调试看这个buf里是不是真的有数据,然后把这个buf里的数据保存起来,再看是否真的保存起来了。
      

  7.   

    我调试一下发现nLength=-858993460    buf全为-52 '? data1 里面全为
        -6.277438562...e+66   说明是错的  但是不会改.。
      

  8.   

      经调试 发现  nLength=-858993460; buf 全为-52  data1 全为 -6.277438562..e+66
      肯定是错的  但是咋改呢?
      

  9.   

    ReadComm这个函数的作用应该是从串口读取数据,貌似是你自己实现的,那就跟进去一步一步调试,要不你上代码把,我没做过这方面的,也许无法帮助你
      

  10.   

    这是一个和dsp联系起来的上位机     我想在上位机中将dsp的读来的数据用图形方式显示。关于串口读取方面是抄的一本书上的  可以用 。但是我自己的部分就是将数据处理下 ,没有成功。我把上位机工程发给你吧。
    邮箱? 给我下
      

  11.   

    DoModal()会将主线程挂起,建议使用非模态对话框显示,或者直接显示在view里面
    代码不管是放在doc还是view还是app,其实是一样的,无非是跨类调用
    不知道你在哪个线程里面调用SetTimer的?另外每次OnTimer都会调用一次DoModal()会有问题的。
      

  12.   

    使用MFC,只要你用到CDocument就把数据放到Doc中,这绝对不会错。把数据放到Doc中你将会得到MFC框架的支持(你站在MS的肩膀上),把数据放到其他地方你需要自己造轮子。
      

  13.   

    代码贴出来  有兴趣的看下  
       // TTYView.cpp : implementation of the CTTYView class
    //#include "stdafx.h"
    #include "TTY.h"
    #include "TTYDoc.h"
    #include "TTYView.h"
    #include "CDrawRate.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CTTYViewIMPLEMENT_DYNCREATE(CTTYView, CEditView)BEGIN_MESSAGE_MAP(CTTYView, CEditView)
    //{{AFX_MSG_MAP(CTTYView)
    ON_WM_CHAR()
    ON_WM_TIMER()
    //}}AFX_MSG_MAP
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
    ON_MESSAGE(WM_COMMNOTIFY, OnCommNotify)
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CTTYView construction/destructionCTTYView::CTTYView()
    {
    // TODO: add construction code here}CTTYView::~CTTYView()
    {
    }BOOL CTTYView::PreCreateWindow(CREATESTRUCT& cs)
    {
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs BOOL bPreCreated = CEditView::PreCreateWindow(cs);
    cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL); // Enable word-wrapping return bPreCreated;
    }/////////////////////////////////////////////////////////////////////////////
    // CTTYView drawingvoid CTTYView::OnDraw(CDC* pDC)
    {
    CTTYDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    pDC->TextOut(200,200,pDoc->aaa);
    }/////////////////////////////////////////////////////////////////////////////
    // CTTYView printingBOOL CTTYView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    // default CEditView preparation
    return CEditView::OnPreparePrinting(pInfo);
    }void CTTYView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
    {
    // Default CEditView begin printing.
    CEditView::OnBeginPrinting(pDC, pInfo);
    }void CTTYView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
    {
    // Default CEditView end printing
    CEditView::OnEndPrinting(pDC, pInfo);
    }/////////////////////////////////////////////////////////////////////////////
    // CTTYView diagnostics#ifdef _DEBUG
    void CTTYView::AssertValid() const
    {
    CEditView::AssertValid();
    }void CTTYView::Dump(CDumpContext& dc) const
    {
    CEditView::Dump(dc);
    }CTTYDoc* CTTYView::GetDocument() // non-debug version is inline
    {
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTTYDoc)));
    return (CTTYDoc*)m_pDocument;
    }
    #endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
    // CTTYView message handlers
    void CTTYView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    CTTYDoc* pDoc=GetDocument();

    char c=(char)nChar; AfxMessageBox("键盘字符收到",MB_OK,0); if(!pDoc->m_bConnected)
    return; AfxMessageBox("应经连接了",MB_OK,0); pDoc->WriteComm(&c, 1); if(pDoc->m_bEcho) 
    CEditView::OnChar(nChar, nRepCnt, nFlags); // 本地回显
    }
    LRESULT CTTYView::OnCommNotify(WPARAM wParam, LPARAM lParam)
    {
    // AfxMessageBox("接受到数据",MB_OK,0); char buf[MAXBLOCK/4];
    CString str;
    int nLength, nTextLength;
    CTTYDoc* pDoc=GetDocument(); CEdit& edit=GetEditCtrl(); if(!pDoc->m_bConnected ||  (wParam & EV_RXCHAR)!=EV_RXCHAR) // 是否是EV_RXCHAR事件?
    {
    SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
    return 0L;
    } nLength=pDoc->ReadComm(buf,100);
    pDoc->aaa.Format("%d",lParam);
        if(nLength)
    {
    nTextLength=edit.GetWindowTextLength();
    edit.SetSel(nTextLength,nTextLength); //移动插入光标到正文末尾
          
    for(int i=0;i<nLength;i++)
    { switch(buf[i])
    { case '\r': // 回车
    if(!pDoc->m_bNewLine) 
    break; case '\n': // 换行
    str+="\r\n";
    break; case '\b': // 退格
    edit.SetSel(-1, 0);
    edit.ReplaceSel(str);
    nTextLength=edit.GetWindowTextLength();
    edit.SetSel(nTextLength-1,nTextLength);
    edit.ReplaceSel(""); //回退一个字符
    str="";
    break; case '\a': // 振铃 
    MessageBeep((UINT)-1);
    break; default : 
    str+=buf[i];
    }
    }
    edit.SetSel(-1, 0);
    edit.ReplaceSel(str); // 向编辑视图中插入收到的字符
    }/* CCDrawRate dlg1;
    if(dlg1.DoModal ()==IDOK)
    {
    dlg1.DrawPoint (); }*/
    SetTimer(1,1000,NULL);
    SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
    return 0L;
    }
    void CTTYView::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    CCDrawRate dlg1;
        CTTYDoc* pDoc=GetDocument(); pDoc->getxdata ();
    pDoc->getydata ();
    if(dlg1.DoModal ()==IDOK)
    {
    if(r>99)
    {
    r=0;
    Invalidate();
    }

    dlg1.DrawPoint (pDoc->xaxis[r],pDoc->data1[r]);
    r++; }
    CEditView::OnTimer(nIDEvent)
         }
    }
    //////////////////////////////////////////////////////////////////////////////////////
    // TTYDoc.cpp : implementation of the CTTYDoc class
    //#include "stdafx.h"
    #include "TTY.h"
    #include "commsetDlg.h"
    #include "TTYDoc.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    /  
      

  14.   

    / CTTYDocIMPLEMENT_DYNCREATE(CTTYDoc, CDocument)BEGIN_MESSAGE_MAP(CTTYDoc, CDocument)
    //{{AFX_MSG_MAP(CTTYDoc)
    ON_COMMAND(ID_API_CONNECT, OnApiConnect)
    ON_UPDATE_COMMAND_UI(ID_API_CONNECT, OnUpdateApiConnect)
    ON_COMMAND(ID_API_DISCONNECT, OnApiDisconnect)
    ON_UPDATE_COMMAND_UI(ID_API_DISCONNECT, OnUpdateApiDisconnect)
    ON_COMMAND(ID_API_SETTINGS, OnApiSettings)
    ON_UPDATE_COMMAND_UI(ID_API_SETTINGS, OnUpdateApiSettings)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    /////////////////////////////////////////////////////////////////////////////
    // CTTYDoc construction/destructionCTTYDoc::CTTYDoc()
    {
    // TODO: add one-time construction code here
    //初始化操作
    m_bConnected=FALSE;//断开连接菜单项无效
    m_pThread=NULL; m_nBaud = 9600;
    m_nDataBits = 8;
    m_bEcho = FALSE;
    m_bNewLine = FALSE;
    m_nParity = 0;
    m_sPort = "COM2";
    m_nStopBits = 0;
    aaa=_T("");
    }CTTYDoc::~CTTYDoc()
    {
    //程序结束时删除线程、关闭串口的操作
    if(m_bConnected)
    CloseConnection(); // 删除事件句柄
    if(m_hPostMsgEvent)
    CloseHandle(m_hPostMsgEvent); if(m_osRead.hEvent)
    CloseHandle(m_osRead.hEvent); if(m_osWrite.hEvent)
    CloseHandle(m_osWrite.hEvent);
    }BOOL CTTYDoc::OnNewDocument()
    {
    //AfxMessageBox("创建新文件",MB_OK,0);
    if (!CDocument::OnNewDocument())
    return FALSE; ((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);
    // TODO: add reinitialization code here
    // (SDI documents will reuse this document)

    // 为WM_COMMNOTIFY消息创建事件对象,手工重置,初始化为有信号的
    if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
    return FALSE; memset(&m_osRead, 0, sizeof(OVERLAPPED));
    memset(&m_osWrite, 0, sizeof(OVERLAPPED)); // 为重叠读创建事件对象,手工重置,初始化为无信号的
    if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
    return FALSE; // 为重叠写创建事件对象,手工重置,初始化为无信号的
    if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
    return FALSE;
    return TRUE;
    }/////////////////////////////////////////////////////////////////////////////
    // CTTYDoc serializationvoid CTTYDoc::Serialize(CArchive& ar)
    {
    // CEditView contains an edit control which handles all serialization
    ((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);
    }/////////////////////////////////////////////////////////////////////////////
    // CTTYDoc diagnostics#ifdef _DEBUG
    void CTTYDoc::AssertValid() const
    {
    CDocument::AssertValid();
    }void CTTYDoc::Dump(CDumpContext& dc) const
    {
    CDocument::Dump(dc);
    }
    #endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
    // CTTYDoc commandsBOOL CTTYDoc::CanCloseFrame(CFrameWnd* pFrame) 
    {
    // TODO: Add your specialized code here and/or call the base class

    SetModifiedFlag(FALSE); // 将文档的修改标志设置成未修改
    return CDocument::CanCloseFrame(pFrame);
    }// 工作者线程,负责监视串行口
    UINT CommProc(LPVOID pParam)
    {
    // AfxMessageBox("监视线程开始",MB_OK,0); OVERLAPPED os;
    DWORD dwMask, dwTrans;
    COMSTAT ComStat;
    DWORD dwErrorFlags; CTTYDoc *pDoc=(CTTYDoc*)pParam; memset(&os, 0, sizeof(OVERLAPPED));
    os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);

    // AfxMessageBox("线程运行标记1",MB_OK,0); if(os.hEvent==NULL)
    {
    AfxMessageBox("Can't create event object!");
    return (UINT)-1;
    } //    AfxMessageBox("线程运行标记2",MB_OK,0); while(pDoc->m_bConnected)
    {
    // AfxMessageBox("循环开始",MB_OK,0); ClearCommError(pDoc->m_hCom,&dwErrorFlags,&ComStat); // AfxMessageBox("线程运行标记3",MB_OK,0); if(ComStat.cbInQue)
    {
    // AfxMessageBox("线程运行标记4",MB_OK,0);
    // 无限等待WM_COMMNOTIFY消息被处理完
    WaitForSingleObject(pDoc->m_hPostMsgEvent, INFINITE);
    ResetEvent(pDoc->m_hPostMsgEvent); // 通知视图
    PostMessage(pDoc->m_hTermWnd, WM_COMMNOTIFY, EV_RXCHAR, 100); continue;
    } dwMask=0; // AfxMessageBox("线程运行标记5",MB_OK,0); if(!WaitCommEvent(pDoc->m_hCom, &dwMask, &os)) // 重叠操作
    { if(GetLastError()==ERROR_IO_PENDING)
    // 无限等待重叠操作结果
    GetOverlappedResult(pDoc->m_hCom, &os, &dwTrans, TRUE);
    else
    {
    CloseHandle(os.hEvent);
    return (UINT)-1;
    }
    }
    } CloseHandle(os.hEvent);
    return 0;
    }// 将指定数量的字符从串行口输出
    DWORD CTTYDoc::WriteComm(char *buf, DWORD dwLength)
    {
    // AfxMessageBox("写串口了",MB_OK,0); BOOL fState;
    DWORD length=dwLength;
    COMSTAT ComStat;
    DWORD dwErrorFlags; ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
    fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite);

        
    if(!fState)
    { if(GetLastError()==ERROR_IO_PENDING)
    {
    GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// 等待
    }
    else
    length=0;
    } return length;
    }// 从串行口输入缓冲区中读入指定数量的字符
    DWORD CTTYDoc::ReadComm(char *buf, DWORD dwLength)
    {
    DWORD length=0;
    COMSTAT ComStat;
    DWORD dwErrorFlags; ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
    length=min(dwLength, ComStat.cbInQue);
    ReadFile(m_hCom,buf,length,&length,&m_osRead);     
    return length;
    }//菜单项"串口连接"的响应
    void CTTYDoc::OnApiConnect() 
    {
    // TODO: Add your command handler code here
    if(!OpenConnection())
    AfxMessageBox("Can't open connection");
    }//更新"串口连接"菜单项
    void CTTYDoc::OnUpdateApiConnect(CCmdUI* pCmdUI) 
    {
    // TODO: Add your command update UI handler code here
    pCmdUI->Enable(!m_bConnected);
    }//菜单项"断开连接"的响应函数
    void CTTYDoc::OnApiDisconnect() 
    {
    // TODO: Add your command handler code here
    CloseConnection(); 
    }//更新菜单项"断开连接"
    void CTTYDoc::OnUpdateApiDisconnect(CCmdUI* pCmdUI) 
    {
    // TODO: Add your command update UI handler code here
    pCmdUI->Enable(m_bConnected);
    }//菜单项"串行口设置" 的响应函数
    void CTTYDoc::OnApiSettings() 
    {
    // TODO: Add your command handler code here
    CCommSetDlg dlg;
    CString str; AfxMessageBox("串口设置",MB_OK,0); dlg.m_bConnected = m_bConnected; dlg.m_sPort = m_sPort; str.Format("%d", m_nBaud);
    dlg.m_sBaud = str; str.Format("%d", m_nDataBits);
    dlg.m_sDataBits = str; dlg.m_nParity = m_nParity;

    dlg.m_nStopBits = m_nStopBits;

    dlg.m_bEcho = m_bEcho;
    dlg.m_bNewLine = m_bNewLine; if(dlg.DoModal() == IDOK)
    {
    m_sPort = dlg.m_sPort;
    m_nBaud = atoi(dlg.m_sBaud);
    m_nDataBits = atoi(dlg.m_sDataBits);
    m_nParity = dlg.m_nParity;
    m_nStopBits = dlg.m_nStopBits;

    m_bEcho=dlg.m_bEcho;
    m_bNewLine=dlg.m_bNewLine; if(m_bConnected)
    if(!ConfigConnection())
    AfxMessageBox("Can't realize the settings!");
    }
    }//更新"串行口设置"菜单项
    void CTTYDoc::OnUpdateApiSettings(CCmdUI* pCmdUI) 
    {
    // TODO: Add your command update UI handler code here

    }
     //配置串口连接
    BOOL CTTYDoc::ConfigConnection()
    {
    DCB dcb; AfxMessageBox("配置连接",MB_OK,0); if(!GetCommState(m_hCom, &dcb))
    return FALSE; dcb.fBinary=TRUE;
    dcb.BaudRate = m_nBaud; // 数据传输速率
    dcb.ByteSize = m_nDataBits; // 每字节位数
    dcb.fParity = TRUE; switch(m_nParity) // 校验设置
    {
    case 0: 
    dcb.Parity=NOPARITY;
    break; case 1: 
    dcb.Parity=EVENPARITY;
    break; case 2: 
    dcb.Parity=ODDPARITY;
    break; default:;
    } switch(m_nStopBits) // 停止位
    {
    case 0: 
    dcb.StopBits=ONESTOPBIT;
    break; case 1: 
    dcb.StopBits=ONE5STOPBITS;
    break; case 2:
    dcb.StopBits=TWOSTOPBITS;
    break; default:;
    } // 硬件流控制设置
    dcb.fOutxCtsFlow = TRUE;
    dcb.fRtsControl = TRUE; // XON/XOFF流控制设置
    dcb.fInX=dcb.fOutX = TRUE;
    dcb.XonChar = XON;
    dcb.XoffChar = XOFF;
    dcb.XonLim = 50;
    dcb.XoffLim = 50; return SetCommState(m_hCom, &dcb);
    }// 打开并配置串行口,建立工作者线程
    BOOL CTTYDoc::OpenConnection()
    {
         AfxMessageBox("打开连接",MB_OK,0); COMMTIMEOUTS TimeOuts;
    POSITION firstViewPos;
    CView *pView; firstViewPos=GetFirstViewPosition();
    pView=GetNextView(firstViewPos); m_hTermWnd=pView->GetSafeHwnd(); if(m_bConnected)
    return FALSE; m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
    NULL); // 重叠方式 if(m_hCom==INVALID_HANDLE_VALUE)
    return FALSE; SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
    SetCommMask(m_hCom, EV_RXCHAR);
    // 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
    TimeOuts.ReadIntervalTimeout=MAXDWORD; 
    TimeOuts.ReadTotalTimeoutMultiplier=0; 
    TimeOuts.ReadTotalTimeoutConstant=0;  /* 设置写超时以指定WriteComm成员函数中的GetOverlappedResult函数的等待时间*/
    TimeOuts.WriteTotalTimeoutMultiplier=50;
    TimeOuts.WriteTotalTimeoutConstant=2000; SetCommTimeouts(m_hCom, &TimeOuts); if(ConfigConnection())
    { m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL, 
    0, CREATE_SUSPENDED, NULL); // 创建并挂起线程 if(m_pThread==NULL)
    {
    CloseHandle(m_hCom);
    return FALSE;
    }
    else {
    m_bConnected=TRUE;
    m_pThread->ResumeThread(); // 恢复线程运行
    }
    }
    else
    {
    CloseHandle(m_hCom);
    return FALSE;
    }

    return TRUE;
    }//关闭连接,关闭工作线程
    void CTTYDoc::CloseConnection()
    {
    if(!m_bConnected)
    return; m_bConnected=FALSE; //结束CommProc线程中WaitSingleObject函数的等待
    SetEvent(m_hPostMsgEvent);  //结束CommProc线程中WaitCommEvent的等待
    SetCommMask(m_hCom, 0);  //等待辅助线程终止
    WaitForSingleObject(m_pThread->m_hThread, INFINITE);
    m_pThread=NULL;
    CloseHandle(m_hCom);}
    void CTTYDoc::getydata ()
    {
             int j;
     int jlength;
     int nLength;
     j=0;
     char data[10];
     char buf[MAXBLOCK/4];
     nLength=ReadComm(buf,100);
            for(int l=0;l<nLength;l++)
    {
    if(47<buf[l]&&buf[l]<58)
    data[j]=buf[l];
    j++;
    jlength=j-1; }
    for (int k;k<jlength+1;k+=4)
    {
    data1[m]=(data[k]-'0')*10+(data[k+1]-'0')+(data[k+2]-'0')*0.1+(data[k+3]-'0')*0.01;
    m++;
    }}
    void CTTYDoc::getxdata()
    {
    for (int i=0;i<100;i++)
    xaxis[i]=5+i*4;
    }  抛砖引玉,希望大家元旦快乐。