📄 readmeterdlg.cpp
字号:
CRCCode = CRCVerify(chrKey,9);
CRCL = CRCCode & 0x00ff;
CRCH = (CRCCode >> 8);
chrKey[9] = CRCH;
chrKey[10] = CRCL;
for(i=0;i<11;i++)
byteKey.Add(chrKey[i]);
// for(i=0; i<11; i++)
// {
// US_TXSEM.ucBuf[i] = chrKey[i];
// }
// US_TXSEM.lDataLen = 11;
// for(i = nTryNum; i>0; i--)
// {
// OSSemPost(US_TXSEM); //发送密码校验指令
// OSSemPend(US_RXSEM, 500, &err); //等待串口的数据,等待的时间和握手中的填充数有关系
m_msComm.SetOutput(COleVariant(byteKey));
delay();
UpdateTXT(chrKey,11);
// if (err == OS_NO_ERR) // 在规定时间内收到数据
// {
// break; //退出循环,对接收的数据进行处理
// }
// else //在规定时间内没有收到数据
// {
// if(i == 1) //如果已经尝试了足够次数,则放弃尝试,认为连接失败
// {
// if(m_msComm.GetCommEvent()!=2)
// return false;
// }
// }
// }
variant_inp=m_msComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
// m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
UpdateTXT(rxdata,len);
//判断返回是否ACK,否则认为无法连接(也可以更改程序,重试9次
/* i=0;
do{
// if(US_RXSEM.ucBuf[i]!=chrACK[i])
if(*(char*)(rxdata+i)!=chrACK[i])
return false;
i++;
}while(i<7);*/
return true; //说明收到了ACK,握手成功.
}
//读class
bool CReadMeterDlg::ReadClass(unsigned char lengthH, unsigned char lengthL, unsigned char addrH, unsigned char addrL, unsigned char classnumb)
{
//chrRead[2]为填充数,chrRead[3]数据长度高字节,chrRead[4]数据长度低字节
//chrRead[5]地址偏移高字节,chrRead[6]地址偏移低字节,
//chrRead[7]类,chrRead[8]CRCH, chrRead[9] CRCL;
unsigned char chrRead[] = {0x02,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01};
unsigned int CRCCode;
unsigned char CRCH,CRCL;
// unsigned char err;
chrRead[3] = lengthH;
chrRead[4] = lengthL;
chrRead[5] = addrH;
chrRead[6] = addrL;
chrRead[7] = classnumb;
CRCCode = CRCVerify(chrRead,8);
CRCL = CRCCode & 0x00ff;
CRCH = (CRCCode >> 8);
chrRead[8] = CRCH;
chrRead[9] = CRCL;
/* for(int i=0; i<10; i++)
{
US_TXSEM.ucBuf[i] = chrRead[i];
}
US_TXSEM.lDataLen = 10;
OSSemPost(US_TXSEM);
OSSemPend(US_RXSEM, 500, &err);
if (err == OS_NO_ERR)
return true;
else */
return false;
}
//断开连接
void CReadMeterDlg::Disconnected()
{
unsigned char chrDisconnect[] = {0x02,0x80, 0xf7,0xea};
CByteArray byteDisconnect;
int i=0;
for(i=0;i<4;i++)
byteDisconnect.Add(chrDisconnect[i]);
// for(int i=0; i<4; i++)
// {
// US_TXSEM.ucBuf[i] = chrDisconnect[i];
// }
// US_TXSEM.lDataLen = 4;
// OSSemPost(US_TXSEM);
m_msComm.SetOutput(COleVariant(byteDisconnect));
UpdateTXT(chrDisconnect,4);
}
//传入的重试次数超过255,则认为等同于0,被认为一直重试
//unsigned char TransferTryNum(int nTryNum)
//{
// unsigned char chrTryNum;
// if(nTryNum >= 255)
// chrTryNum = 0x00;
// //nTryNum 为0-255,
// else
// chrTryNum = nTryNum;
// return chrTryNum;
//}
//CRC校验
unsigned int CReadMeterDlg::CRCVerify(unsigned char CRCByte[], int len)
{
unsigned int iTemp=0;
int i=0,j=0;
for (i=0; i<len; i++)
{
iTemp^=(CRCByte[i]<<8);
for(j=0; j<8; j++)
{
int flag=iTemp & 0x8000;
iTemp <<=1;
if(flag)
{
iTemp^=0x1021;
}
}
}
return iTemp;
}
//假设表的地址从低到高开始填充,比如表地址为112200,
//则ucMeterAdd[0]=0x00 (BCD)
// ucMeterAdd[1]=0x22 (BCD)
// ucMeterAdd[2]=0x11 (BCD)
// ABB表只有0-255,超过255,则只看十位和个位
unsigned char CReadMeterDlg::TransferMeterAdd(unsigned char * ucMeterAdd)
{
unsigned char MeterAddH;
unsigned char MeterAddL;
unsigned char MeterAddNum;
MeterAddH = ucMeterAdd[1];
MeterAddL = ucMeterAdd[0];
if(((MeterAddH & 0x0f) * 100 + (MeterAddL & 0x0f) + ((MeterAddL>>4) & 0x0f) * 10) > 255)
{
MeterAddNum = (MeterAddL & 0x0f) + ((MeterAddL>>4) & 0x0f) * 10;
}
else
MeterAddNum = (MeterAddH & 0x0f) * 100 + (MeterAddL & 0x0f) + ((MeterAddL>>4) & 0x0f) * 10;
return MeterAddNum;
}
//加密口令字计算
unsigned long CReadMeterDlg::CalculateKey(unsigned long key, unsigned long remotepwd)
{
int i,j,k=0;
union
{
unsigned long tempkey;
struct {
unsigned char bytea,byteb,bytec,byted;
}tempparts;
}tempval;
unsigned long temppwd = remotepwd;
tempval.tempkey = key;
// tempval.tempkey = 0x4b7eddc1;
tempval.tempkey += 0xab41;
i= tempval.tempparts.bytea +tempval.tempparts.byteb +tempval.tempparts.bytec+tempval.tempparts.byted;
i = i & 0x0f;
while(i>=0) {
if(tempval.tempparts.byted >= 0x80) j=1;
else j=0;
tempval.tempkey = tempval.tempkey<<1 ;
tempval.tempkey += k;
k=j;
temppwd ^= tempval.tempkey;
i--;
}
return temppwd;
}
bool CReadMeterDlg::Read_Class_11()
{
unsigned char chrReadClass11[] = {0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x0B,0x47,0x6a};
unsigned char ucMeterAdd[] = {0x00,0x00,0x00};
unsigned char chrContinRead[] = {0x02,0x81,0xe7,0xcb};
CByteArray byteReadClass11, byteContinRead;
int nTryNum =10;
int nPtrlCode = 2;
VARIANT m_input1;
COleSafeArray m_input2;
long length,i;
BYTE data[1024];
CString str;
int totaltimes =1;
int k;
for(k=0;k<10;k++)
byteReadClass11.Add(chrReadClass11[k]);
for(k=0;k<4;k++)
byteContinRead.Add(chrContinRead[k]);
// int nn=m_ctrlComm.GetCommEvent();
// str.Format("%d",nn);
// AfxMessageBox(str);
bool success = HandShake(nPtrlCode, nTryNum, ucMeterAdd);
// if(!HandShake(nPtrlCode, nTryNum, ucMeterAdd)) //握手不成功
if(!success)
return false;
m_msComm.SetOutput(COleVariant(byteReadClass11));
delay();
UpdateTXT(chrReadClass11,10);
// do{
// ;
// }while(m_msComm.GetCommEvent()<42);
m_input1=m_msComm.GetInput();//读取缓冲区内的数据
m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
for(i=0;i<length;i++)//将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
str.Format("%c",a);
// m_strRXData+=str;
}
UpdateTXT(data,length);
for(totaltimes=7; totaltimes>0; totaltimes--)
{
m_msComm.SetOutput(COleVariant(byteContinRead));
delay();
UpdateTXT(chrContinRead,10);
// do{
// ;
// }while(m_msComm.GetCommEvent()<42);
m_input1=m_msComm.GetInput();//读取缓冲区内的数据
m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
for(i=0;i<length;i++)//将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
str.Format("%c",a);
// m_strRXData+=str;
}
UpdateTXT(data,length);
}
m_msComm.SetOutput(COleVariant(byteContinRead));
delay();
UpdateTXT(chrContinRead,10);
// do{
// ;
// }while(m_msComm.GetCommEvent()<30);
m_input1=m_msComm.GetInput();//读取缓冲区内的数据
m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
for(i=0;i<length;i++)//将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
str.Format("%c",a);
// m_strRXData+=str;
}
UpdateTXT(data,length);
Disconnected();
return true;
}
void CReadMeterDlg::delay()
{
long i=0,j=0;
for(i=0;i<10000;i++)
{
for(j=0;j<10000;j++)
{;
}
}
}
void CReadMeterDlg::UpdateTXT(unsigned char* hexdata, int idatalen)
{
int i;
unsigned char temphexdata;
unsigned char tempdataH;
unsigned char tempdataL;
for(i=0; i<idatalen; i++)
{
temphexdata = *(hexdata + i);
if((temphexdata>>4) > 9)
tempdataH = (char)((temphexdata>>4)-10 +'a');
else
tempdataH =(char)((temphexdata >>4)+'0');
if((temphexdata & 0x0f) > 9)
tempdataL = (char)((temphexdata & 0x0f)-10 +'a');
else
tempdataL =(char)((temphexdata & 0x0f)+'0');
m_strRXData +=tempdataH;
m_strRXData +=tempdataL;
}
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -