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

📄 bao.c

📁 msp430F435做的医疗器械,包括语音模块,知识源于网络
💻 C
字号:
#include "bao.h"
#include "xieyi.h"
#include "df_uart.h"

unsigned char aRxBuff[N_XY_BAO];	//接收数据缓冲区
unsigned char NRxBuff=0;
unsigned char aTxBuff[N_XY_BAO]; //发送数据缓冲区
unsigned char NTxBuff=0;

unsigned char bWaitRe=0;	//1:发送数据包后等待PC返回对数据包的校验结果;0:不等待
unsigned char Command=NONE_COMMAND;  	//收到的指令
unsigned char SendByte=0;					//准备发送的字节数

unsigned char bUartRxErr=0; //1:接收数据出错,如帧错、奇偶校验错等;0:没错
/*****************************************************************************
数据包校验
采用算术和的方法进行
pbuffer:指向要校验的数据缓冲区的指针
n_byte:校验的字节数
pjiao_zhi:计算出的校验值
返回值:校验通过为1,校验失败为0

******************************************************************************/
unsigned char JiaoYan(unsigned char *pbuffer,unsigned char n_byte,unsigned char *pjiao_zhi)
{
	unsigned char q0,q1=0;

	for(q0=0;q0<n_byte-1;q0++)
	{
		q1 += *pbuffer;
		pbuffer++;
	}

	*pjiao_zhi=q1;
	if(q1== *pbuffer)
		return 1;
	else
		return 0;
}

/*****************************************************************************
向接收缓冲区中增加一个数据
******************************************************************************/
void AddUsData(unsigned char sq0)
{
	if(NRxBuff<N_XY_BAO)
	{
		aRxBuff[NRxBuff]=sq0;
		NRxBuff++;
	}
}

/*****************************************************************************
处理Uart数据包
p0: 用来返回发送的数据的字节数
返回值:指向发送缓冲区的指针
******************************************************************************/
unsigned char* DoUart(unsigned char *p0)
{
  	unsigned char q0;
	unsigned int iq0;
	//判断接收数据
	if(NRxBuff!=0)
	{
		if(aRxBuff[0]==HAND_OK&&bWaitRe==1&&bUartRxErr==0)
		{
			//发送完数据包,等待PC校验结果
			bWaitRe=0;
			NRxBuff=0;
			SendByte=0;
		}
		else if(aRxBuff[0]==HAND_ERR&&bWaitRe==1&&bUartRxErr==0)
		{
			//发送完数据包,等待PC校验结果
			SendByte=N_XY_BAO;
			NRxBuff=0;
		}
		else if(aRxBuff[0]==HAND_BAO&&bWaitRe==0&&bUartRxErr==0)
		{
			if(NRxBuff==N_XY_BAO)
			{
				//数据包接收完毕
				if(JiaoYan(aRxBuff,N_XY_BAO,&q0)==1)
				{
					//数据校验通过
					Command=aRxBuff[1];
				}
				else
				{
					//数据校验错误
					aTxBuff[0]=HAND_ERR;
					SendByte=1;
				}
				NRxBuff=0;
			}
		}
		else
		{
			//aRxBuff[0]不是合法的值或者数据接收错误
			aTxBuff[0]=HAND_ERR;
			SendByte=1;
			NRxBuff=0;
			bUartRxErr=0;
		}
	}
	//处理指令
	iq0=DoCommand(Command);
	if(Command!=NONE_COMMAND)
	{
		aTxBuff[0]=HAND_BAO;
		aTxBuff[2]=iq0>>8;
		aTxBuff[3]=iq0&0xFF;
		JiaoYan(aTxBuff,N_XY_BAO,&aTxBuff[4]);
		SendByte=N_XY_BAO;
		Command=NONE_COMMAND;
	}
	if(SendByte==N_XY_BAO)
		bWaitRe=1;
	*p0=SendByte;
	return aTxBuff;
}
/****************************************************************************
其他模块检测到数据包有错时通知本模块数据通信有错
****************************************************************************/
void SetBaoErr()
{
	bUartRxErr=1;
}
/****************************************************************************
执行指令
****************************************************************************/
unsigned int DoCommand(unsigned char comd)
{
	switch(comd)
	{
		case ADD_COMMAND:
			//执行ADD_COMMAND指令:数据A+数据B
			return (aRxBuff[2]+aRxBuff[3]);
		case SUB_COMMAND:
			//执行SUB_COMMAND指令:数据A-数据B
			return (aRxBuff[2]-aRxBuff[3]);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -