#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;
}
}
串口接收到字符指令的处理
最新推荐文章于 2025-04-24 17:20:48 发布