串口接收到字符指令的处理

#include <string.h>

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;

#define n_1MS_5MS 	 5
#define n_1MS_1000MS 1000

#define _RX_DATA //接收寄存器
#define _TX_DATA //发送寄存器
#define NO_DATA_ERROR_DELAY_TIME	 	n_1MS_1000MS//如果一直没有数据就报错
#define DATA_RECV_COMPLETE_DELAY_TIME   n_1MS_5MS//接到数据后,多长时间无数据即为接收结束

#define RX_RESPONSE_BUFFER_LENGTH 200
typedef struct
{
	uint8_t AckCompleteTimeDec;//接收完毕倒计时
	uint8_t StartRecvFlag;//开始接收
	uint8_t GetAtLeastOneDataFlag;//至少获得一个数据
	uint16_t RecvNothingTimeDec;//未接到数据的时间计时
	
	uint16_t BufferLength;//
	uint8_t Buffer[RX_RESPONSE_BUFFER_LENGTH+1];

}InstructionResponseStruct;

InstructionResponseStruct ResponseCom;


void main(void)
{
	while(1)
	{
		ResponseBlockCmd("AT\r\n","OK");
	}
	
}

/**********************************
 * 返回值 0:错误 1:正确
 *********************************/
uint8_t ResponseBlockCmd(const char *pSend,const char *pRes)
{
	ResponseCom.AckCompleteTimeDec = DATA_RECV_COMPLETE_DELAY_TIME;
	ResponseCom.RecvNothingTimeDec = NO_DATA_ERROR_DELAY_TIME;
	ResponseCom.BufferLength = 0;
	ResponseCom.GetAtLeastOneDataFlag = 0;

	while(*pSend != '\0')
	{
		ResponseSendBuf(*pSend);
		pSend++;
	}

	ResponseCom.StartRecvFlag = 1;

	while(ResponseCom.StartRecvFlag != 0);//接收完毕或者错误了

	if(ResponseCom.RecvNothingTimeDec == 0)return 0;

	ResponseCom.Buffer[ResponseCom.BufferLength] = '\0';
	if(NULL != strstr(ResponseCom.Buffer,pRes))return 1;
	return 0;
}

void ResponseSendBuf(uint8_t dat)//发送函数
{
	_TX_DATA = dat;//这里自己做成缓存发送
}


void ResponseTimeCount(void)//1ms执行一次
{
	if(ResponseCom.StartRecvFlag)
	{
		if(ResponseCom.GetAtLeastOneDataFlag)//获取至少一个数据后进数据接收完毕的判断
		{
			if(ResponseCom.AckCompleteTimeDec == 0)
			{
				ResponseCom.StartRecvFlag = 0;//停止接收
			}
			else//否则进没接到任何数据的延时报错判断
			{
				if(ResponseCom.AckCompleteTimeDec)ResponseCom.AckCompleteTimeDec--;
			}
		}
		else
		{
			if(ResponseCom.RecvNothingTimeDec)ResponseCom.RecvNothingTimeDec--;
			else ResponseCom.StartRecvFlag = 0;//停止接收
		}
	}
	
}

void interruptReceive(void)//接收中断
{
	uint8_t dat = _RX_DATA;
	if(ResponseCom.StartRecvFlag)
	{
		ResponseCom.GetAtLeastOneDataFlag = 1;
		ResponseCom.AckCompleteTimeDec = DATA_RECV_COMPLETE_DELAY_TIME;
		ResponseCom.Buffer[ResponseCom.BufferLength++] = dat;
		if(ResponseCom.BufferLength >= RX_RESPONSE_BUFFER_LENGTH)ResponseCom.BufferLength = 0;
	}
}






  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值