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