📄 testwrite.cpp
字号:
/*int xbh(void)//向电表中写表号;
{
clrscr();
char *time=new char[8];
char *Mc=new char[2];
char *Addr=new char[8];
char *writeName1=new char[4];
int num,count;
unsigned tmp;
char fhead[12];
writeName1[0]=0;
time[0]=0;
Mc[0]=0;
Addr[0]=0;
strcat(writeName1, "C032");
strcat(Addr, "99999999");
do
{
if (writedata1(writeName1,Mc,Addr)==0)
{
clrscr();
printf ("%s","success");
getch();
count=18;
num++;
}
else
{
count++;
}
}while(count<3);//enddo
}//endfor
dbfclose();
delete [] writeName1;
delete [] Mc;
delete [] Addr;
clrscr();
return 0;
}*/
//---------------------------------------------------
int LwriteData(char *Addr,char * address)
{
//addr 为数据项,address 为返回的数据项
unsigned char workmode,commport; //定义工作模试 通讯口
unsigned int baudrate; //定义波特率
if (!ComPlsInstalled()) //测试通讯内核是否安装
{
clrscr();
printf("Complus must be installed first!!! \n"); //首先必须安置通讯
getch ();
return(1);
}
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]; //发送后读取的数据
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(0x04);
SendStream->Add(0x08);//数据长度
SendStream->Add(0x32+0x33);//两位标识码
SendStream->Add(0xC0+0x33);
SendStream->Add(0x00+0x33);
SendStream->Add(0x00+0x33);
// strncat(TStr1,TStr,8-strlen(Addr));
// strcat(Addr,TStr1); //把数据放在的址
Addr+=7;//数据长度,此时为4个字节
while(strlen(Addr)>0)
{
TStr1[0]=0;
strncat(TStr1,Addr,2); //将字符串2个地址加到TStr1中
SendStream->Add((unsigned char)Str2Hex(TStr1)+0x33);
Addr-=2;
}
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++)
{
PutAuxByte(Buff[i]);
}
clrscr();
printf("%s","send over\n");
EnableRx(0);
/****************************************************************/
unsigned char c; //义返回字符
unsigned char flagchar; // 设步
unsigned char Errflag=0; // 将错误标记付0
unsigned char *AddrBuff=new unsigned char[5]; // 定义地址缓冲区
unsigned char CtrlCode; // 控制码
unsigned char DataLeng; // 数据长度
unsigned char *DataBuff; // 数据缓冲区
unsigned char RCS;
unsigned char CS; // 校验码
unsigned char DebugChar;
flagchar=1;
DataLeng=0; //初始化数据长度为0
clrscr();
i=0;
RCS=0x68;
while(Errflag==0 && flagchar!=6) //分步判断字符是否正确,并且存在缓冲区中
{
if(ReceiveChar(c,50)==0) //如果接到了数据(在1秒钟之内)
{
Errflag=1;
break;
}
else
{ //接收数据从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","002\n"); // 第二步错
Errflag=2; // 数据校验错
}//end if(c==0x68)
}
else
{
if(i>4) // 是否在大于4位是出现FE
{
printf("%s","003\n");
Errflag=2;
}
}//end if(c!=0xFE)
break;
}
case 2:
{
if(i==7)
{
if(c==0x68) // 如果C=68第二步完成
{
i=0; // 在第一个数据中
flagchar=3; // 转到第三步
}
else
{
printf("%s","004\n"); //如果不是68错误
Errflag=2;
}
}
else
{
AddrBuff[i-1]=c; //如果I小于7取出字符并且放在地址中
}
break;
}//IF(I=7)
case 3:
{
if(i==1)
{
CtrlCode=c; // 控制码
if(CtrlCode!=0x84) Errflag=2;
}
/*if(CtrlCode==0xc4)
{
}*/
if(i==2)
{
DataLeng=c;
flagchar=4; //转到第4步 case4
i=0;
}
break;
}
case 4:
{
if(DataLeng==0) //
{
i=0;
flagchar=5;
//printf("%s" ,"Success\n");
}
else
{
printf("%s","005\n"); //如果数据长度不为0
Errflag=2;
}
break;
}
case 5:
{
if(i==1 && RCS!=c)
{
printf("%d",RCS);
Errflag=3;
}
if(i==2)
{
if(c==0x16)
{
printf("%s" ,"Success\n");
flagchar=6;
}
else
{
printf("%s","005\n");
Errflag=2;
}
}
int z;
char *Str1;
address[0]=0;
for (z=0;z<12;z++)
{
Byte2Hex(AddrBuff[z],Str1);
strcat(address,Str1);
}
flagchar=6;
break;
}
}//end switch
}
delete SendStream; //延时发送
delete TStr1;
delete AddrBuff;
SetCommMode(workmode, commport, baudrate); /* 设置工作模式 通讯口 波特率resume comm setting */
DisableRx();
return Errflag;
}
//---------------------------------------------------
int ReceiveChar(unsigned char &c,long delay) //在接收数据时延时 C表示接收到的数据 DELAY表示延时
{
long t;
unsigned char far * AuxByte; //接收字0符
unsigned char far *Status; // 状态
t=GetSec()+delay; // t目标时间 G当前时间 D延时时间
while(GetSec()<t)
{
if(AuxByteExist(AuxByte,Status)) //取字符接收状态
{
GetAuxByte(&c,Status); // 读取字符及其接收状态
return 1;
}
}
return 0;
}
int Byte2Hex(unsigned char num,char * HexStr)//转换为十六进制字符串
{
int num1,num2; //定义字符串个数
char c1,c2;
num1=num/16; //将第一串字符转换成十六进制整数
num2=num%16; //将第二串字符转换成十六进制小数
if(num1<10)
{
c1=48+num1;// 相当于十以下的数
}
else
{
c1=64+num1-9;// 相当于A B C等
}
if(num2<10)
{
c2=48+num2;
}
else
{
c2=64+num2-9;
}
HexStr[0]=c1;
HexStr[1]=c2;
HexStr[2]=0;
return 1;
}
//------------------------------------------------------------
long Str2Hex(char * Str) //将字符串转换成十六进制数
{
int i;
long Sum=0;
int Len=strlen(Str);// LEN 表示长度
for(i=0;i<Len;i++)
{
switch (Str[i]) //存放取得的字符串
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{ //0-9
Sum+=(Str[i]-48)*(long)pow(16,(Len-1-i));
// printf("%s\n",Sum);
break;
}
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
{
Sum+=(Str[i]-55)*(long)pow(16,(Len-1-i));
// printf("%s\n",Sum);
break;
}
}//end switch
}//end for
return Sum;
}
//--------------------------------------------------
unsigned char Byte2BCD(unsigned char byte)
{
return (int)byte/10*16 + byte%10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -