// 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); }}