⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.c

📁 C8051ucos源码
💻 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 + -