📄 meterbase.cpp
字号:
// MeterBase.cpp: implementation of the CMeterBase class.
//
//////////////////////////////////////////////////////////////////////
#include <unistd.h>
#include <stdlib.h>
#include "MeterBase.h"
#include "MPGB.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*
typedef struct
{
BYTE status;//电表状态
BYTE property;//电表性质
BYTE addr[6];//电表地址
BYTE protcol;//电表协议
BYTE port;//测量点端口号
BYTE baudrate;//波特率
BYTE bytesize;//数据位长度
BYTE stopbits;//停止位
BYTE parity;//校验和
}METERCOMPARA;//电表通讯参数 //890F
typedef struct
{
METERCOMPARA com_para;
BYTE type;//电表接线方式 8910
BYTE No; //电表序号
}METERPARA;
*/
CMeterBase::CMeterBase()
{
// printf("\r\nCMeterBase()");
// m_meter_com_para.com_No = 0;
// m_meter_com_para.com_bcd.parity = 2;
// m_meter_com_para.com_bcd.BaudRate = 4;
// m_meter_com_para.com_bcd.ByteSize = 8;
// m_meter_com_para.com_bcd.StopBits = 0;
}
CMeterBase::CMeterBase(METERPARA meter)
{
// printf("\r\nCMeterBase(METERPARA meter)");
memcpy(&m_meter,&meter,sizeof(METERPARA));
// pMPBase = new CMPGB();
}
CMeterBase::~CMeterBase()
{
delete pMPBase;
}
bool CMeterBase::AttachCom(MyCom *pCom)
{
pMyCom = pCom;
if(pMyCom == NULL)
return false;
return true;
}
bool CMeterBase::AttachShmMan(ShmMan *pShm)
{
pShmMan = pShm;
if(pShmMan == NULL)
return false;
return true;
}
bool CMeterBase::OnOpenCom()
{
pMyCom->Init_Serial( m_meter.com_para );//初始化串口参数失败
if ( !pMyCom->sem_serial_open() ) //打开端口
{
#ifdef DBUG_PRO
printf("Open COMM%d FALSE!!",m_meter.com_para.port);
#endif
return false;
}
usleep(100);//程序挂起,1个MS,用与装缓转换时间
return true;
}
bool CMeterBase::OnCloseCom()
{
if(pMyCom == NULL)
return false;
pMyCom->sem_serial_close();
usleep(10000);
return true;
}
int CMeterBase::Write(BYTE *buff, int Len)
{
return pMyCom->serial_write(buff,Len);
}
int CMeterBase::Read(BYTE *buff, int Len)
{
return pMyCom->serial_read(buff,Len);//int SerialCom::serial_read(unsigned char * buf, int len)
}
bool CMeterBase::WaitForReponse(int t)
{
return pMyCom->wait_for_response( t );
}
bool CMeterBase::GetData(BYTE *data,int &dataLen,int item)
{
int FrmLen,RecvLen;
BYTE tmp_buf[256];
BYTE buff[64];
FrmLen = pMPBase->FormReadDataFrame(buff, item, m_meter.com_para.addr);
if(FrmLen == 0)
{
#ifdef DBUG_PRO
printf("\r\n组织命令数据失败!!!!");
#endif
return false;
}
int j,i;
for(i = 0; i < 2; i ++)
{
if( !OnOpenCom() )
{
continue;//串行口打开失败
}
Write(buff,FrmLen); //发送帧
if ( !WaitForReponse(TIME_SEC) ) //等待回应帧
{
OnCloseCom();
continue;
}
RecvLen = Read(tmp_buf,sizeof(tmp_buf) ); //读取帧
OnCloseCom();
dataLen = 0;
j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,item,data,dataLen,m_meter.com_para.addr);
printf("\r\nDATALEN %d j = %d",dataLen,j);
if ( j == 0 || j == 0x0600 )//解析帧
{
return true;
}
}
return false;
}
bool CMeterBase::SetAddress(BYTE *address,int &Len)
{
int FrmLen,RecvLen;
BYTE tmp_buf[256];
BYTE buff[64];
Len = 0;
FrmLen = pMPBase->FormSetAddress(buff, m_meter.com_para.addr);
if(FrmLen == 0)
{
#ifdef DBUG_PRO
printf("\r\n组织命令数据失败!!!!");
#endif
return false;
}
int j,i;
for(i = 0; i < 2; i ++)
{
if( !OnOpenCom() )
{
continue;//串行口打开失败
}
Write(buff,FrmLen); //发送帧
if ( !WaitForReponse(TIME_SEC) ) //等待回应帧
{
OnCloseCom();
continue;
}
RecvLen = Read(tmp_buf,sizeof(tmp_buf) ); //读取帧
OnCloseCom();
j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,0xC032,address,Len,m_meter.com_para.addr);
if ( j == 0 )//解析帧
{
return true;
}
}
return false;
}
bool CMeterBase::SetClock(time_t *m_time)//无数据响应
{
int FrmLen;
// BYTE tmp_buf[256];
BYTE buff[64];
FrmLen = pMPBase->FormCheckClock(buff, m_time);//(BYTE *buff,time_t *m_time = NULL) = 0
if(FrmLen == 0)
{
#ifdef DBUG_PRO
printf("\r\n组织命令数据失败!!!!");
#endif
return false;
}
if( !OnOpenCom() )
{
return false;//continue;//串行口打开失败
}
Write(buff,FrmLen); //发送帧
OnCloseCom();
return true;
}
bool CMeterBase::SetShmStatus(BYTE m_status)
{
pShmMan->SetStatus( m_status,m_meter.No );
return true;
}
#ifdef DBUG_PRO
bool CMeterBase::Display()
{
printf("\r\n METER NO = %d;",m_meter.No);
printf("\r\n METER TYPE = %d;",m_meter.type);
printf("\r\n METER STATUS = %d;",m_meter.com_para.status);
printf("\r\n METER property = %d;",m_meter.com_para.property);
printf("\r\n METER addr = %02x%02x%02x%02x%02x%02x;",
m_meter.com_para.addr[0],m_meter.com_para.addr[1],m_meter.com_para.addr[2],
m_meter.com_para.addr[3],m_meter.com_para.addr[4],m_meter.com_para.addr[5]
);
printf("\r\n METER protcol = %d;",m_meter.com_para.protcol);
printf("\r\n METER port = %d;",m_meter.com_para.port);
printf("\r\n METER baudrate = %d;",m_meter.com_para.baudrate);
printf("\r\n METER bytesize = %d;",m_meter.com_para.bytesize);
printf("\r\n METER stopbits = %d;",m_meter.com_para.stopbits);
printf("\r\n METER parity = %d;",m_meter.com_para.parity);
return true;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -