📄 subfun1.cpp
字号:
#include "SubFun.h"
#include "Infrared.h"
#include "CommPlus.h"
#include <String.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include "CStream.h"
#include "dos.h"
#include "htlcd.h"
extern int ReceiveFileChar(unsigned char &C,int delay);
long GetSec(void)
{
long Secs;
time *t;
gettime(t);
Secs=t->ti_hour*360000;
Secs+=t->ti_min*6000;
Secs+=t->ti_sec*100;
Secs+=t->ti_hund;
return (Secs);
}
long GetSec(void *timestruct)
{
long Secs;
time *t;
t=(time *)timestruct;
Secs=t->ti_hour*360000;
Secs+=t->ti_min*6000;
Secs+=t->ti_sec*100;
Secs+=t->ti_hund;
return (Secs);
}
//--------------------------------------------------------------------------
int ReceiveChar(unsigned char &c,long delay) //在接收数据时延时 C表示接收到的数据 DELAY表示延时
{
long t;
unsigned char far * AuxByte; //接收字符
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));
break;
}
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
{
Sum+=(Str[i]-55)*(long)pow(16,(Len-1-i));
break;
}
}//end switch
}//end for
return Sum;
}
//---------------------------------------------------
int ReadData(char * DataName ,char *Getval,char * Addr) //读数据DataName读到的数据名称 Getval读到的据内容 Addr读到的数据地址
{
unsigned char workmode,commport; //定义工作模试 通讯口
unsigned int baudrate; //定义波特率
/**********************************************************************/
if (!ComPlsInstalled()) //测试通讯内核是否安装
{
printf("Complus must be installed first!!! \n"); //首先必须安置通讯
exit(1);
}
GetCommMode(&workmode, &commport, &baudrate);
SetCommMode(_AUX_MODE+_mod_8D1P+_par_EVEN , 0, 1200);
EnableRx(0);
/***************************************************************************/
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);
strncat(TStr1,TStr,8-strlen(Addr));
strcat(Addr,TStr1); //把数据放在的址
while(strlen(Addr)>0)
{
TStr1[0]=0;
strncat(TStr1,Addr,2); //将字符串2个地址加到TStr1中
SendStream->Add((unsigned char)Str2Hex(TStr1));
Addr+=2;
}
SendStream->Add(0x68);
SendStream->Add(0x01);
SendStream->Add(0x02);
strcpy(TStr,DataName);//
TStr+=2;
SendStream->Add((unsigned char)Str2Hex(TStr)+0x33); //发送数据 数据域加上0X33
TStr-=2;
TStr[2]=0; //将数据名付出值
SendStream->Add((unsigned char)Str2Hex(TStr)+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[5]; // 定义地址缓冲区
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[6000]; //定义6000个字节的缓冲区
int iStation=0; //当前抄到的有效学符数
flagchar=1;
DataLeng=0; //初始化数据长度为0
clrscr();
do
{
i=0;
RCS=0x68;
TStr[0]=0;
DataFlag[0]=0;
while(Errflag==0 && flagchar!=6) //分步判断字符是否正确,并且存在缓冲区中
{
/*****************************************************************/
//if(ReceiveFileChar(c,50)==0)
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=3; // 数据校验错
}//end if(c==0x68)
}
else
{
if(i>4) // 是否在大于4位是出现FE
{
printf("%s","003\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","004\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;
}
if(i==2) // 长度
{
DataLeng=c;
flagchar=4; //转到第4步 case4
i=0;
}
break;
}
case 4:
{
if(i<=2)//取出数据标识
{
unsigned char cTemp=c-0x33;
Byte2Hex(cTemp,TStr);
strcat(TStr,DataFlag);
strcpy(DataFlag,TStr);
if(i==2) //已经取出数据标
{
if(strcmp(DataFlag,DataName)!=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","005\n");
Errflag=9;
}
}
break;
}
}//end switch
}//end while
flagchar=1;
}while(CtrlCode==0xA1 && Errflag==0);
Getval[0]=0;//初始字符串为空
if(Errflag==0)
{
for(i=iStation-1;i>=0;i--)
{
Byte2Hex(DataBuff[i],TStr);
strcat(Getval,TStr);
}
}
delete [] DataBuff;
delete [] AddrBuff;
delete SendStream; //延时发送
delete TStr1;
/*******************************************************************/
SetCommMode(workmode, commport, baudrate); /* 设置工作模式 通讯口 波特率resume comm setting */
DisableRx();
/******************************************************************/
return Errflag;//返回错误标识 如果为0为成功
}
//-----------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -