#include "usart.h"
#include "stdlib.h"
#define RX_BUFFER_SIZE (16)//缓冲区个数
typedef enum
{
rx_idle,//空闲状态
rx_running,//接收状态
rx_end,//接收完成状态
rx_overflow//溢出状态
}
uart_state;
typedef struct{
unsigned char rx_buf[RX_BUFFER_SIZE];//缓冲区
unsigned char rx_len;//接收个数
uart_state state;//接收状态
}uart_t;
uart_t uart1 = {{0},0,rx_idle};//初始化
//以下函数放到接收中断中
void uart_rx(void)
{
static unsigned char enter = 0;//定义接收状态
if(uart1.state == rx_idle || uart1.state == rx_running)//如果处于接收状态
{
uart1.state = rx_running;//正在接收
uart1.rx_buf[uart1.rx_len] = SBUF;//SBUF是接收到的字符
if(uart1.rx_buf[uart1.rx_len] == '\r')//如果接收到了\r,代表快接收完了。
{
enter = 1;//标记接收到了最后
}
if(enter == 1)//如果出现标记
{
if(uart1.rx_buf[uart1.rx_len] == '\n')//判断接收到的字符是不是\n
{
uart1.state = rx_end;//如果是,标记接收完成
}
}
else
{
enter = 0;
}
uart1.rx_len++;//每接收一个,字符个数+1
if(uart1.rx_len >= RX_BUFFER_SIZE)//如果内存溢出了
{
//提示内存不够
uart1.state = rx_overflow;
}
}
}
//以下代码放到死循环中
void uart_mainfunction(void)
{
if(uart1.state == rx_end)//识别到接收完成
{
//开始识别指令
if(strncmp(uart1.rx_buf,"?",uart1.rx_len - 2) == 0)//识别到?
{
//做出动作
}
else if(strncmp(uart1.rx_buf,"AT + OPEN",uart1.rx_len - 2) == 0)
{
//做出开动作
}
else if(strncmp(uart1.rx_buf,"AT + OLOSE",uart1.rx_len - 2) == 0)
{
//做出关动作
}
else
{
//指令错误
}
uart1.rx_len = 0;//执行完成后清0
uart1.state = rx_idle;//设置为空闲状态
}
else if(uart1.state == rx_overflow)
{
uart1.rx_len = 0;
uart1.state = rx_idle;
}
}
串口中断AT指令模板
最新推荐文章于 2024-07-15 11:00:22 发布