通过前文2个模块 可以完成灵活的传递ID-函数 这样的结构到内部
那么需要一个解析的内部
需要一个任务 跑上面的函数 也就是执行ID的函数 任务
需要一个任务去接线FIFO专门做这个事情 给上面提供支持
比如串口的数据 过来就直接放在FIFO 我单独做一个任务去解析FIFO
开始吧!
先做一个FIFO接受
在做一个FIFO解析
先用简单的版本
#ifndef __RINGBUFF_H_
#define __RINGBUFF_H_
#include "stdint.h"//uint8_t 等
typedef unsigned char u8;
typedef unsigned short u16;
typedef struct
{
void (*init) (void);
uint8_t (*write)(uint8_t data);
uint8_t (*read) (uint8_t *rData);
}FIFO_FUNCTION_Type;
extern FIFO_FUNCTION_Type FIFO;
#endif
#include "ringBuff.h"
#define FLASE 1
#define TRUE 0
#define RINGBUFFCAPACITY 512 //定义最大接收字节数
typedef struct
{
u16 Head;
u16 Tail;
u16 Lenght;
u8 Ring_Buff[RINGBUFFCAPACITY];
}RingBuff_t;
static RingBuff_t ringBuff;//创建一个ringBuff的缓冲区
void RingBuff_Init(void);
u8 Write_RingBuff(u8 data);
u8 Read_RingBuff(u8 *rData);
FIFO_FUNCTION_Type FIFO={RingBuff_Init,Write_RingBuff,Read_RingBuff};
void RingBuff_Init(void)
{
ringBuff.Head = 0;
ringBuff.Tail = 0;
ringBuff.Lenght = 0;
}
u8 Write_RingBuff(u8 data)
{
if(ringBuff.Lenght >= RINGBUFFCAPACITY) return FLASE;
ringBuff.Ring_Buff[ringBuff.Tail]=data;
ringBuff.Tail = (ringBuff.Tail+1)%RINGBUFFCAPACITY;
ringBuff.Lenght++;
return TRUE;
}
u8 Read_RingBuff(u8 *rData)
{
if(ringBuff.Lenght == 0) return FLASE;
*rData = ringBuff.Ring_Buff[ringBuff.Head];
ringBuff.Head = (ringBuff.Head+1)%RINGBUFFCAPACITY;
ringBuff.Lenght--;
return TRUE;
}
简单 它有几个菜鸟问题1--结构体用的 数组 而不是指针不够灵活 2--多外提供的接口 内部的节点 分开了 但是不够好 多个FIFO怎么办呢 3--现在是单字节的处理 相当于串口一个一个进来 然后你再一个一个读 不够智能!
它的测试:
--IT
void USART1_IRQHandler(void)
{
UsartReceive_RX(&huart1);
// UsartReceive_IDLE(&huart1);这个函数不能启动!!否则上面RX第一次成功以后都是失败
HAL_UART_IRQHandler(&huart1);
}
void UsartReceive_RX(UART_HandleTypeDef *huart)
{
if((__HAL_UART_GET_FLAG(huart,UART_FLAG_RXNE) != RESET))
{
__HAL_UART_CLEAR_PEFLAG(&huart1);
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_PE);//清标志
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_FE);
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_NE);
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE);
FIFO.write((unsigned char )huart1.Instance->RDR);
}
}
void StartTask03(void const * argument)
{
u8 data;
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
for(;;)
{
if(0 == FIFO.read(&data))//从环形缓冲区中读取数据
{
printf("%02X ",data); //没有业务逻辑 直接发送出去
}
osDelay(1);
}
}