UART HAL使用环形队列收发数据
#ifndef USER_COMFIFO_H
#define USER_COMFIFO_H
#include "stm32f4xx_hal.h"
#define RINGBUFF_LEN 512
typedef struct
{
uint16_t Head;
uint16_t Tail;
uint16_t Lenght;
uint8_t Ring_Buff[RINGBUFF_LEN];
}RingBuff_t;
RingBuff_t ringBuff;//创建一个ringBuff的缓冲区
void RingBuff_Init(void);
uint8_t Write_RingBuff(uint8_t data);
uint8_t Read_RingBuff(uint8_t *rData);
#endif
#include"ComFIFO.h"
/**
* @brief RingBuff_Init
* @param void
* @return void
* @author 杰杰
* @date 2018
* @version v1.0
* @note 初始化环形缓冲区
*/
void RingBuff_Init(void)
{
//初始化相关信息
ringBuff.Head = 0;
ringBuff.Tail = 0;
ringBuff.Lenght = 0;
}
/**
* @brief Write_RingBuff
* @param u8 data
* @return FLASE:环形缓冲区已满,写入失败;TRUE:写入成功
* @author 杰杰
* @date 2018
* @version v1.0
* @note 往环形缓冲区写入u8类型的数据
*/
uint8_t Write_RingBuff(uint8_t data)
{
if(ringBuff.Lenght >= RINGBUFF_LEN) //判断缓冲区是否已满
{
return 0;
}
ringBuff.Ring_Buff[ringBuff.Tail]=data;
// ringBuff.Tail++;
ringBuff.Tail = (ringBuff.Tail+1)%RINGBUFF_LEN;//防止越界非法访问
ringBuff.Lenght++;
return 1;
}
/**
* @brief Read_RingBuff
* @param u8 *rData,用于保存读取的数据
* @return FLASE:环形缓冲区没有数据,读取失败;TRUE:读取成功
* @author 杰杰
* @date 2018
* @version v1.0
* @note 从环形缓冲区读取一个u8类型的数据
*/
uint8_t Read_RingBuff(uint8_t *rData)
{
if(ringBuff.Lenght == 0)//判断非空
{
return 0;
}
*rData = ringBuff.Ring_Buff[ringBuff.Head];//先进先出FIFO,从缓冲区头出
// ringBuff.Head++;
ringBuff.Head = (ringBuff.Head+1)%RINGBUFF_LEN;//防止越界非法访问
ringBuff.Lenght--;
return 1;
}
2、调用方法
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART3)
{
Write_RingBuff(RxBuffer[0]);
//USARTx_ReceiveFIFO_PutChar(&Com1FIFO,RxBuffer[0]);
HAL_UART_Receive_IT(&huart3, (uint8_t *)RxBuffer, 1);
}
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
//USARTx_ReceiveFIFO_Init(&Com1FIFO);
RingBuff_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
HAL_UART_Receive_IT(&huart3, (uint8_t *)RxBuffer, 1);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
uint8_t data[1024];
uint16_t dataLength=0;
uint16_t read=Read_RingBuff(&data[dataLength]);
if(read>0)dataLength++;
while(read>0)
{
read=Read_RingBuff(&data[dataLength]);
if(read>0)dataLength++;
}
HAL_UART_Receive_IT(&huart3, (uint8_t *)RxBuffer, 1);
if(dataLength>0)
{
HAL_UART_Transmit(&huart3, (uint8_t *)data, dataLength,0xFFFF);
}
}
}
参考:https://blog.csdn.net/jiejiemcu/article/details/80563422
本博客是个人工作中记录,更深层次的问题可以提供有偿技术支持。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。

浙公网安备 33010602011771号