📄 复件 subfun.cpp
字号:
Name+=2;
SendStream->Add((unsigned char)Str2Hex(Name)+0x33); //发送数据 数据域加上0X33
Name -=2;
Name[2]=0; //将数据名付出值
SendStream->Add((unsigned char)Str2Hex(Name)+0x33);
SendStream->Addcs(); //存放数据地址
SendStream->Add(0x16);
char *Str;
unsigned char * Buff;
Buff=(unsigned char *)SendStream->Memory();
int size=SendStream->Size();
/*****************************************************************/
for(i=0;i<size;i++) //for(i=0;i<SendStream->StreamLeng;i++)
{
PutAuxByte(Buff[i]);
}
//printf("%s","send over\n");
EnableRx(0);
/****************************************************************/
unsigned char c; //义返回字符
unsigned char flagchar; // 设步
unsigned char Errflag=0; // 将错误标记付0
unsigned char *AddrBuff=new unsigned char[6]; // 定义地址缓冲区
unsigned char CtrlCode; // 控制码
unsigned char DataLeng; // 数据长度
unsigned char *DataBuff; // 数据缓冲区
unsigned char RCS; // 累加校验码
unsigned char CS; // 校验码
unsigned char DebugChar;
char DataFlag[5]; // 读出的数据标识
DataBuff=new unsigned char[600]; //定义6000个字节的缓冲区
int iStation=0; //当前抄到的有效学符数
flagchar=1;
DataLeng=0;
ClrLCDScr(); //初始化数据长度为0
//clrscr;
// RefreshWin();
// do
// {
i=0;
RCS=0x68;
Str[0]=0;
DataFlag[0]=0;
while(Errflag==0 && flagchar!=6) //分步判断字符是否正确,并且存在缓冲区中
{
/*****************************************************************/
// #ifdef DEBUG
// if(ReceiveFileChar(c,50)==0)
// #else
if(ReceiveChar(c,50)==0) //如果接到了数据(在1秒钟之内)
// #endif
/*****************************************************************/
{
Errflag=1;
printf("%s","no recive");
break;
}else
{
//printf("%d\n", c);
// getch(); //接收数据从1开始
if(flagchar>1 && flagchar<5)
{
asm mov AL,RCS
asm add AL,c
asm mov RCS,AL // 先取解校验码
}
i++;
} // 第一步握手协OXFE
switch(flagchar)
{
case 1:
{
if(c!=0xFE)
{
if(c==0x68)
{
if(i==1)
{
printf("%s","001 Error\n"); //错误显示001
RCS=0x68;
Errflag=2; //2表示数据错
}
else
{
// 第一步完成 转到第二步
i=0;
flagchar=2;
}
}
else // 如果取的数不为68则为第二步错误
{
i=0;
printf("%s","first is not recive\n"); // 第二步错
Errflag=3; // 数据校验错
}//end if(c==0x68)
}
else
{
if(i>4) // 是否在大于4位是出现FE
{
printf("%s","fouth is FE\n");
Errflag=4;
}
}//end if(c!=0xFE)
break;
}
case 2:
{
if(i==7)
{
if(c==0x68) // 如果C=68第二步完成
{
i=0; // 在第一个数据中
flagchar=3; // 转到第三步
}
else
{
printf("%s","seacon is not 68\n"); //如果不是68错误
Errflag=5;
}
}
else
{
AddrBuff[i-1]=c; //如果I小于7取出字符并且放在地址中
}
break;
}//IF(I=7)
case 3:
{
if(i==1)
{
CtrlCode=c; // 控制码
if(CtrlCode!=0x82 && CtrlCode!=0xA2)
{ Errflag=6;
printf("%s"," ctrcode is errror\n");
// printf("%d",c);
getch();
}
}
if(i==2) // 长度
{
DataLeng=c;
flagchar=4; //转到第4步 case4
i=0;
}
break;
}
case 4:
{
if(i<=2)//取出数据标识
{
unsigned char cTemp=c-0x33;
Byte2Hex(cTemp,Str);
strcat(Str,DataFlag);
strcpy(DataFlag,Str);
if(i==2) //已经取出数据标
{
if(strcmp(DataFlag,DataN)!=0)
Errflag=7; //数据标识错识
}
}else
{
if(i<=DataLeng) // 如果长度小于总长度
{
DataBuff[iStation]=c-0x33; // 有效数据域中减33
iStation++; // 有效字符数
if(i==DataLeng) // 全部有效字符读取完毕
{
i=0;
flagchar=5;
}
}
}
break;
}
case 5:
{
if(i==1 && RCS!=c)
{
Errflag=8;
}
if(i==2)
{
if(c==0x16)
{
flagchar=6;
}
else
{
printf("%s","Rsc is error\n");
Errflag=9;
}
}
break;
}
}//end switch
}//end while
// flagchar=1;
// }while(CtrlCode==0xA1 && Errflag==0);
Getval[0]=0;//初始字符串为空
address[0]=0;
int z;
char *Str1;
if(Errflag==0)
{
for (z=6;z>=0;z--)
{
Byte2Hex(AddrBuff[z],Str1);
strcat(address,Str1);
}
for(i=iStation-1;i>=0;i--)
{
Byte2Hex(DataBuff[i],Str);
strcat(Getval,Str);
}
democtrl=CtrlCode;
demolength=DataLeng;
}
// delete [] DataN;
delete [] DataBuff;
delete [] AddrBuff;
delete SendStream; //延时发送
delete [] TStr1;
delete TStr;
delete Name;
delete [] Buff;
delete Str;
delete Str1;
/*******************************************************************/
DisableRx();
SetCommMode(workmode, commport, baudrate);
TurnOffR232;
/******************************************************************/
return Errflag ; //返回错误标识 如果为0为成功
}
//读窃电数据+++++++++++++++++++++++++++++++++++++++++++++++++++++++
int ReadData1(char * DataN ,char *Getval,char * sz)//读窃电数据;
{
unsigned char workmode,commport; //定义工作模试 通讯口
unsigned int baudrate; //定义波特率
if (!ComPlsInstalled()) //测试通讯内核是否安装
{ //clrscr;
ClrLCDScr();
//RefreshWin();
// ClrGraph;
RefreshWin();
printf("Complus must be installed first!!! \n"); //首先必须安置通讯
getch();
return (1);
}
TurnOnR232;
GetCommMode(&workmode, &commport, &baudrate);
SetCommMode(_AUX_MODE+_mod_8D1P+_par_EVEN , 0, 1200);
CStream * SendStream; //字符流发送
SendStream=new CStream;
int i;
char * TStr="00000000"; //发送前数据
char * TStr1=new char [50]; //发送后读取的数据
char * Name="0000";
TStr1[0]=0;
for(i=0;i<=3;i++) SendStream->Add(0xFE); // 发送四个FE
SendStream->Add(0x68);
SendStream->Add(0x99) ;
SendStream->Add(0x99);
SendStream->Add(0x99);
SendStream->Add(0x99);
SendStream->Add(0x99);
SendStream->Add(0x99);
SendStream->Add(0x68);
SendStream->Add(0x01);
SendStream->Add(0x02);
strcpy(Name,DataN);//
Name+=2;
SendStream->Add((unsigned char)Str2Hex(Name)+0x33); //发送数据 数据域加上0X33
Name -=2;
Name[2]=0; //将数据名付出值
SendStream->Add((unsigned char)Str2Hex(Name)+0x33);
SendStream->Addcs(); //存放数据地址
SendStream->Add(0x16);
char *Str;
unsigned char * Buff;
Buff=(unsigned char *)SendStream->Memory();
int size=SendStream->Size();
/*****************************************************************/
for(i=0;i<size;i++) //for(i=0;i<SendStream->StreamLeng;i++)
{
PutAuxByte(Buff[i]);
}
// printf("%s","send over\n");
EnableRx(0);
/****************************************************************/
unsigned char c; //义返回字符
unsigned char flagchar; // 设步
unsigned char Errflag=0; // 将错误标记付0
unsigned char *AddrBuff=new unsigned char[6]; // 定义地址缓冲区
unsigned char CtrlCode; // 控制码
unsigned char DataLeng; // 数据长度
unsigned char *DataBuff; // 数据缓冲区
unsigned char RCS; // 累加校验码
unsigned char CS; // 校验码
unsigned char DebugChar;
char DataFlag[5]; // 读出的数据标识
DataBuff=new unsigned char[600]; //定义6000个字节的缓冲区
int iStation=0; //当前抄到的有效学符数
flagchar=1;
DataLeng=0; //初始化数据长度为0
//clrscr;
ClrLCDScr();
//RefreshWin();
// do
// {
i=0;
RCS=0x68;
Str[0]=0;
DataFlag[0]=0;
while(Errflag==0 && flagchar!=6) //分步判断字符是否正确,并且存在缓冲区中
{
/*****************************************************************/
if(ReceiveChar(c,50)==0) //如果接到了数据(在1秒钟之内)
/*****************************************************************/
{
Errflag=1;
printf("%s","no recive");
break;
}else
{
//printf(" %d", c);
// getch(); //接收数据从1开始
if(flagchar>1 && flagchar<5)
{
asm mov AL,RCS
asm add AL,c
asm mov RCS,AL // 先取解校验码
}
i++;
} // 第一步握手协OXFE
switch(flagchar)
{
case 1:
{
if(c!=0xFE)
{
if(c==0x68)
{
if(i==1)
{
printf("%s","001 Error\n"); //错误显示001
RCS=0x68;
Errflag=2; //2表示数据错
}
else
{
// 第一步完成 转到第二步
i=0;
flagchar=2;
}
}
else // 如果取的数不为68则为第二步错误
{
i=0;
printf("%s","first is not recive\n"); // 第二步错
Errflag=3; // 数据校验错
}//end if(c==0x68)
}
else
{
if(i>4) // 是否在大于4位是出现FE
{
printf("%s","fouth is FE\n");
Errflag=4;
}
}//end if(c!=0xFE)
break;
}
case 2:
{
if(i==7)
{
if(c==0x68) // 如果C=68第二步完成
{
i=0; // 在第一个数据中
flagchar=3; // 转到第三步
}
else
{
printf("%s","seacon is not 68\n"); //如果不是68错误
Errflag=5;
}
}
else
{
AddrBuff[i-1]=c; //如果I小于7取出字符并且放在地址中
}
break;
}//IF(I=7)
case 3:
{
if(i==1)
{
CtrlCode=c; // 控制码
if(CtrlCode!=0x81 && CtrlCode!=0xA1)
{ Errflag=6;
printf("%s"," ctrcode is errror\n");
// printf("%d",c);
getch();
}
}
if(i==2) // 长度
{
DataLeng=c;
flagchar=4; //转到第4步 case4
i=0;
}
break;
}
case 4:
{
if(i<=2)//取出数据标识
{
unsigned char cTemp=c-0x33;
Byte2Hex(cTemp,Str);
strcat(Str,DataFlag);
strcpy(DataFlag,Str);
if(i==2) //已经取出数据标
{
if(strcmp(DataFlag,DataN)!=0)
Errflag=7; //数据标识错识
}
}else
{
if(i<=DataLeng) // 如果长度小于总长度
{
DataBuff[iStation]=c-0x33; // 有效数据域中减33
iStation++; // 有效字符数
if(i==DataLeng) // 全部有效字符读取完毕
{
i=0;
flagchar=5;
}
}
}
break;
}
case 5:
{
if(i==1 && RCS!=c)
{
Errflag=8;
}
if(i==2)
{
if(c==0x16)
{
flagchar=6;
}
else
{
printf("%s","Rsc is error\n");
Errflag=9;
}
}
break;
}
}//end switch
}//end while
// flagchar=1;
// }while(CtrlCode==0xA1 && Errflag==0);
Getval[0]=0;//初始字符串为空
int z;
char *Str1;
if(Errflag==0)
{
for (z=6;z>=0;z--)
{
Byte2Hex(AddrBuff[z],Str1);
strcat(sz,Str1);
}
for(i=iStation-1;i>=0;i--)
{
Byte2Hex(DataBuff[i],Str);
strcat(Getval,Str);
}
democtrl=CtrlCode;
demolength=DataLeng;
}
// printf ("%s","success");
delete [] DataBuff;
delete [] AddrBuff;
delete SendStream; //延时发送
delete [] TStr1;
delete TStr;
delete Name;
delete [] Buff;
delete Str;
// delete DataN;
delete Str1;
/*******************************************************************/
DisableRx();
SetCommMode(workmode, commport, baudrate);
TurnOffR232;
/******************************************************************/
return Errflag ; //返回错误标识 如果为0为成功
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -