#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;
}
}
09-30
4998
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
09-16
5308
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
01-03
4486
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
01-06
887
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交