性能小钢炮-注册技术2

通过前文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);
  }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值