datarec.cpp

    技术2022-05-20  40

    // DataRec.cpp : implementation file//

    #include "stdafx.h"#include "MyApp.h"#include "DataRec.h"

    #include "fstream.h"

    #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif

    /// DataRec dialogCByteArray dataArray;  // 用于保存串口返回的数据BYTE  str[10][100];int reclen;bool reccom = false;

    DataRec::DataRec(CWnd* pParent /*=NULL*/) : CDialog(DataRec::IDD, pParent){ //{{AFX_DATA_INIT(DataRec) m_receivestr = _T(""); //}}AFX_DATA_INIT}

    void DataRec::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(DataRec) DDX_Control(pDX, IDC_CHECK1, m_OCT); DDX_Control(pDX, IDC_COMBO_SB, m_StopBits); DDX_Control(pDX, IDC_COMBO_PORT, m_Port); DDX_Control(pDX, IDC_COMBO_PARITY, m_Parity); DDX_Control(pDX, IDC_COMBO_DB, m_DataBits); DDX_Control(pDX, IDC_COMBO_BR, m_Speed); DDX_Text(pDX, IDC_EDIT_RECDATA, m_receivestr); DDV_MaxChars(pDX, m_receivestr, 1000); //}}AFX_DATA_MAP}

    BEGIN_MESSAGE_MAP(DataRec, CDialog) //{{AFX_MSG_MAP(DataRec) ON_WM_PAINT() ON_CBN_SELENDOK(IDC_COMBO_PORT, OnSelendokComboPort) ON_CBN_SELENDOK(IDC_COMBO_BR, OnSelendokComboBr) ON_CBN_SELENDOK(IDC_COMBO_DB, OnSelendokComboDb) ON_CBN_SELENDOK(IDC_COMBO_PARITY, OnSelendokComboParity) ON_CBN_SELENDOK(IDC_COMBO_SB, OnSelendokComboSb) ON_BN_CLICKED(ID_CONNECT, OnConnect) //}}AFX_MSG_MAPEND_MESSAGE_MAP()

    /// DataRec message handlers

    void DataRec::OnPaint(){ CPaintDC dc(this); // device context for painting

     // Do not call CDialog::OnPaint() for painting messages}

    BEGIN_EVENTSINK_MAP(DataRec, CDialog)    //{{AFX_EVENTSINK_MAP(DataRec) ON_EVENT(DataRec, IDC_MSCOMM2, 1 /* OnComm */, OnOnCommMscomm2, VTS_NONE) //}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()

    void DataRec::OnOnCommMscomm2(){ // TODO: Add your control notification handler code here   VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[1024]; int same = 0;   //事件值为2表示接收缓冲区内有字符 if(m_comm.GetCommEvent()==2)      {     variant_inp=m_comm.GetInput(); //读缓冲区  safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量  len=safearray_inp.GetOneDimSize(); //得到有效数据长度  reclen += len;  for(k=0; k<len; k++)  {   safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组   BYTE bt=*(char*)(rxdata+k); //字符型  //7d 5d  = 7d  //7d 5e  = 7e /*  if(bt == 0x7d)   {    same = 1;   }   if(same==1)   {    if(bt==0x5d)     bt = 0x7d;    if(bt == 0x5e)     bt = 0x7e;   }   if(same==0)    dataArray.Add(bt);*/  }         if(reclen) == 0)  {      reclen = 0;   OnComm();     }  else  {   if(reclen>58)    reclen = 0;  }    }}

    void DataRec::OnComm(){ CString result; CString strtemp;    //调试用 /*ofstream outfile; outfile.open("data.txt",ios::app|ios::out);  strtemp.Format("oncomm!!!    ");    outfile<<strtemp;   */      CButton* pbtn = (CButton*)GetDlgItem(IDC_CHECK1);    oct_choose = pbtn->GetCheck();        int m_day,m_hour,m_minute,m_second,m_msecond;

     //获取系统时间 SYSTEMTIME  systime; GetSystemTime(&systime); m_day = systime.wDay;              //日期 m_hour = (systime.wHour+8)$;     //systime格林威治时间到北京时间的转换 m_minute = systime.wMinute; m_second = systime.wSecond; m_msecond = systime.wMilliseconds;

     //strtemp.Format("%d   %d   %d  %d  %d   ",m_day,m_hour,m_minute,m_second,m_msecond);    //outfile<<strtemp;

        //清空显示窗口 nrec++; nrec = nrec % 5; if(nrec == 0) {  m_receivestr.Empty();        //strtemp.Format("empty!!!   ");        //outfile<<strtemp; }

     int i=dataArray.GetSize(); bool replace = false; int j,k,l,m,temp,count,mid,pid,v1,v2,v3,v4,v5; for(temp = 0,l = 0,k = 0,m = 0,j = 0;j<i;j++) {  if(dataArray.GetAt(j) == 0x7e)  {   str[k][m] =dataArray.GetAt(j);   m++;   if(m>temp)    temp = m;   l = (l+1) % 2;   if(l == 0)   {   k++;   m = 0;   }     continue;  }

      if(dataArray.GetAt(j) == 125)  {    replace = true;   continue;  }

      if(replace == true && dataArray.GetAt(j) == 93)  {   str[k][m++] = 125;   if(m > temp)    temp = m;   replace = false;   continue;     }

      if(replace == true && dataArray.GetAt(j) == 94)  {   str[k][m++] = 126;   if(m > temp)    temp = m;   replace = false;   continue;  }

      str[k][m] =dataArray.GetAt(j);  m++;    if(m > temp)   temp = m;   }     //outfile<<"d0  ";  dataArray.RemoveAll();     //strtemp.Format("temp:%d  k:%d ",temp,k);     //   outfile<<strtemp; for(l = 0;l < k;l++) {  count = 0;  dSet.Open();         //打开记录集 // outfile<<"f0  ";    // dSet.MoveLast(); // while(!dSet.IsEOF()) //  dSet.MoveNext();       dSet.AddNew();  for(j = 0; j<temp;  j++)   {      switch(j)   {   case 10:    mid = str[l][j]*256;    break;   case 11:        mid += str[l][j];    dSet.m_ID =mid;    break;   case 12:    pid = str[l][j]*256;    break;   case 13:    pid += str[l][j];    dSet.m_PID = pid;    break;   case 14:    count = str[l][j]*256;    break;   case 15:    count += str[l][j];    dSet.m_COUNTER = count;    break;   case 16:    v1 = str[l][j]*256;    break;   case 17:    v1 += str[l][j];    dSet.m_VALUE1 = v1;    break;   case 18:    v2 = str[l][j]*256;    break;   case 19:    v2 += str[l][j];    dSet.m_VALUE2 = v2;     break;   case 20:    v3 = str[l][j]*256;    break;   case 21:    v3 += str[l][j];    dSet.m_VALUE3 = v3;    break;   case 22:    v4 = str[l][j]*256;    break;   case 23:    v4 += str[l][j];    dSet.m_VALUE4 = v4;    break;   case 24:     v5 = str[l][j] * 256;    break;   case 25:    v5 += str[l][j];    dSet.m_VALUE5 = v5;     break;   }   if(oct_choose)    strtemp.Format("d  ",str[l][j]);   else    strtemp.Format("X  ",str[l][j]);   result += strtemp;    }   dSet.m_DAY = m_day;  dSet.m_HOUR = m_hour;  dSet.m_MINUTE = m_minute;  dSet.m_SECOND = m_second;  dSet.m_MSECOND = m_msecond;     //outfile<<"f1  ";  dSet.Update();  dSet.Requery();  dSet.Close();  /*outfile<<"f3  ";  m_receivestr += result;   outfile<<result;         */  result.Empty();  strtemp.Format(";    ");  m_receivestr += strtemp;          UpdateData(FALSE);

      /*outfile<<strtemp;        strtemp.Format("/r/n");        outfile<<strtemp;        outfile.close();        */  

      bool data_new = true;  if(relat_x == 0)   {   relat[relat_x][0] = mid;   relat[relat_x][1] = pid;   relat[relat_x][2] = count;   relat[relat_x][3] = v1;   relat[relat_x][4] = v2;   relat[relat_x][5] = v3;   relat[relat_x][6] = v4;   relat[relat_x][7] = v5;   relat_x++;   }  else   {   for(j = 0;j<relat_x;j++)    {    if(relat[j][0] == mid)     {     relat[j][1] = pid;     relat[j][2] = count;     relat[j][3] = v1;     relat[j][4] = v2;     relat[j][5] = v3;     relat[j][6] = v4;     relat[j][7] = v5;     data_new = false;     }    }   if(data_new)    {    relat[relat_x][0] = mid;    relat[relat_x][1] = pid;    relat[relat_x][2] = count;    relat[relat_x][3] = v1;    relat[relat_x][4] = v2;    relat[relat_x][5] = v3;    relat[relat_x][6] = v4;    relat[relat_x][7] = v5;    relat_x++;    }   }  }    //outfile.close();  }

    BOOL DataRec::OnInitDialog(){ CDialog::OnInitDialog();

     // TODO: Add extra initialization here relat_x = 0; oct_choose = 0; nrec = 0 ; m_Port.SetCurSel(0); m_Speed.SetCurSel(11); m_Parity.SetCurSel(0); m_DataBits.SetCurSel(0); m_StopBits.SetCurSel(0); m_nBaud = 115200;       //波特率 m_nCom = 1;         //串口号 m_cParity = 'N';    //校验 m_nDatabits = 8;    //数据位 m_nStopbits = 1; if (!m_comm.Create(NULL,WS_VISIBLE,CRect(0,0,0,0),this,IDC_MSCOMM2))    {               AfxMessageBox("创建串口失败!");       } if(m_comm.GetPortOpen())   m_comm.SetPortOpen(FALSE);

     return TRUE;  // return TRUE unless you set the focus to a control               // EXCEPTION: OCX Property Pages should return FALSE}

    void DataRec::OnSelendokComboPort() { // TODO: Add your control notification handler code here m_nCom = m_Port.GetCurSel() + 1;

    }

    void DataRec::OnSelendokComboBr() { // TODO: Add your control notification handler code here int i=m_Speed.GetCurSel(); switch(i) { case 0:  m_nBaud = 300;  break; case 1:  m_nBaud = 600;  break; case 2:  m_nBaud = 1200;  break; case 3:  m_nBaud = 2400;  break; case 4:  m_nBaud = 4800;  break; case 5:  m_nBaud = 9600;  break; case 6:  m_nBaud = 19200;  break; case 7:  m_nBaud = 38400;  break; case 8:  m_nBaud = 43000;  break; case 9:  m_nBaud = 56000;  break; case 10:  m_nBaud = 57600;  break; case 11:  m_nBaud = 115200;  break; default:  m_nBaud = 115200;  break; } }

    void DataRec::OnSelendokComboDb() { // TODO: Add your control notification handler code here int i=m_DataBits.GetCurSel(); switch(i) { case 0:  m_nDatabits = 8;  break; case 1:  m_nDatabits = 7;  break; case 2:  m_nDatabits = 6;  break; default:        m_nDatabits = 8;  break; }}

    void DataRec::OnSelendokComboParity() { // TODO: Add your control notification handler code here  char temp; int i=m_Parity.GetCurSel(); switch(i) { case 0:  temp = 'N';  break; case 1:  temp = 'O';  break; case 2:  temp = 'E';  break;    default:  temp = 'N';  break; } m_cParity = temp;}

    void DataRec::OnSelendokComboSb() { // TODO: Add your control notification handler code here int i=m_StopBits.GetCurSel(); switch(i) { case 0:  m_nStopbits = 1;  break; case 1:  m_nStopbits = 2;  break; } }

    void DataRec::OnConnect() { // TODO: Add your control notification handler code here    CString str_zt1,str_zt2; CString seting;     if (!m_comm.GetPortOpen()) {  m_receivestr.Empty();   m_comm.SetCommPort(m_nCom);      m_comm.SetInBufferSize(1024);     m_comm.SetOutBufferSize(512);        m_comm.SetInputLen(0);  //设置当前接收区数据长度为0,表示全部读取        m_comm.SetInputMode(1);          m_comm.SetRThreshold(3);//当接收3个字符就响应一个OnCom事件                seting.Format("%d,%c,%d,%d",m_nBaud,m_cParity,m_nDatabits,m_nStopbits);         m_comm.SetSettings(seting);

      m_comm.SetPortOpen(TRUE);  GetDlgItem(ID_CONNECT)->SetWindowText("断开");    str_zt1.Format("COM%d,%d,%c,%d,%d 打开成功!!!",m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits);  GetDlgItem(IDC_STATIC_ZT)->SetWindowText(str_zt1); // m_comm.SetInputLen(0);     m_comm.GetInput(); } else {  m_comm.SetPortOpen(FALSE);  if(dSet.IsOpen())   dSet.Close();  GetDlgItem(ID_CONNECT)->SetWindowText("连接");  str_zt2.Format("COM%d 关闭!!!",m_nCom);  GetDlgItem(IDC_STATIC_ZT)->SetWindowText(str_zt2);   m_comm.SetOutBufferCount(0); }}


    最新回复(0)