📄 comm.c
字号:
#include "C8051F020.h"
#include "CM240128.H"
#include "menu.h"
#include "引导菜单.h"
#include "数据存储.h"
#include "comm.h"
#include "gprs.h"
#include "功能选择菜单.h"
xdata unsigned char CommIncBuf[260];
idata unsigned char CommIncLen;
/*
通信帧结构
BYTE0:帧头(0xda)
BYTE1:命令字()
BYTE2:数据长度(0-250)
BYTE3-BYTE(3+n-1):数据区(n)
BYTE3+n:累加和(帧头+命令字+数据长度+数据区)
*/
//---------------------------------------------------
void CommInit(void)
{
CommIncLen=0;
}
//---------------------------------------------------
void CommIncept(unsigned char val)
{
if((CommIncLen==0)&&(val!=0xda))
return;//判断数据头
else
CommIncBuf[CommIncLen++]=val;
}
//---------------------------------------------------
void CommIncClr(void)
{
ES0=0;
CommIncLen=0;
ES0=1;
}
//---------------------------------------------------
void CommSendPack(unsigned char cmd,unsigned char *pbuf,unsigned char len)
{
xdata unsigned char buf[300];
unsigned char i,sum;
buf[0]=0xda;
buf[1]=cmd;
buf[2]=len;
for(i=3;i<len+3;i++)buf[i] = *pbuf++;
sum=0;
for(i=0;i<len+3;i++)sum += buf[i];
buf[i]=sum;
UART0Write(buf,len+4);
}
//---------------------------------------------------
void CommInceptProc(void)
{
unsigned char i,sum,len,cmd,j;
unsigned char *pbuf;
xdata unsigned char buf[300];
unsigned int cnt,val;
unsigned char *p;
if(CommIncLen<4)return;
if(CommIncBuf[0]!=0xda){CommIncClr();return;}//头不对
len = CommIncBuf[2];
if(len>250)
{CommIncClr();return;}//数据区长度错
if((len+4)>CommIncLen)
return;//帧没收全
sum=0;
for(i=0;i<len+3;i++){sum+=CommIncBuf[i];}
if(sum != CommIncBuf[i])
{CommIncClr();return;}//校验和错
cmd = CommIncBuf[1];
pbuf = &CommIncBuf[3];
//正确接收
if(cmd==1)//查询命令
{
/*
回应的信息有
2字节机器编号
数据区记录数量
当前日期和时间
*/
cnt = GetDataCount();
buf[0]=cnt/256;
buf[1]=cnt%256;
CommSendPack(2,buf,2);//查询回应 h回应数据区中没读的数据
}
if(cmd==3)//完成远程控制命令
{
CommSendPack(4,0,0);//完成远程控制命令的回应
GPRSEnd();
MENU_Option(0);
}
if(cmd==5)//读取数据区命令(参数区中有4个字节,每两个字节一组,每组高字节在前,前面的是要读取的位子,后面的是要读取的记录数量(总字节数不能大于250))
{
cnt=pbuf[0]*256+pbuf[1];//取得读取的数据长度
if(cnt<=4)
if(GetSendBufCnt()==0)
{
CommSendPack(8,0,0);//没有数据
}
else
{
p=GetDataBuf(0);
for(j=0;j<cnt;j++)
{
for(i=0;i<sizeof(DataType);i++)
{
buf[j*sizeof(DataType)+i]=*p++;
}
}
CommSendPack(6,buf,cnt*sizeof(DataType));//回应数据区中的数据
}
}
if(cmd==7)//指针下移命令
{
val=pbuf[0]*256+pbuf[1];
if(DataLocAdd(val)!=0)
CommSendPack(9,0,0);//还有数据
else
CommSendPack(8,0,0);//没有数据
}
CommIncLen=0;
}
//---------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -