datarec.cpp

来源:互联网 发布:ubuntu修复grub引导 编辑:程序博客网 时间:2024/06/11 19:45

// DataRec.cpp : implementation file
//

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

#include "fstream.h"

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

/////////////////////////////////////////////////////////////////////////////
// DataRec dialog
CByteArray 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_MAP
END_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_MAP
END_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%29 == 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)%24;     //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("%02d  ",str[l][j]);
   else
    strtemp.Format("%02X  ",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);
 }
}

原创粉丝点击