?? 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;//電表狀態(tài)
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); //發(fā)送幀
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); //發(fā)送幀
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); //發(fā)送幀
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 + -