上一节我已经讲解了使用串口设置发送命令来校准万年历的时间,本节还是来测试串口功能,这节就来讲解一下循环队列的作用,使用循环队列来实现将接收到底数据完整的发送到串口助手上进行打印。
还是先上个美女镇楼吧!

好了,先打开smart configurator 配置软件,设置好串口,这个之前讲过,这里就不在赘述了。
下面是循环队列的代码
#include "stdint.h"
#include "string.h"
#include "Ring_Buffer.h"
#include "stdlib.h"
int32_t RINGBUF_Init(RINGBUF *r, uint8_t *buf,uint32_t size){
if(r == NULL || buf == NULL || size < 2) return -1;
r->pt = buf;
r->head = 0;
r->tail = 0;
r->size = size;
return 0;
}
int8_t RINGBUF_Put(RINGBUF *r, uint8_t c){
uint32_t temp;
temp = r->head;
temp++;
if(temp >= r->size)
{
temp = 0;
}
if(temp == r->tail)
{
return -1;//Ring buffer full
}
r->pt[r->head] = c;
r->head = temp;
return 0;
}
int32_t RINGBUF_Get(RINGBUF r, uint8_t c)
{
if(r->tail == r->head)
{
return -1;
}
*c = r->pt[r->tail];
r->tail++;
if(r->tail >= r->size)
{
r->tail = 0;
}
return 0;
}
int8_t RINGBUF_Clear(RINGBUF *r, uint8_t num)
{
if(r->tail == r->head)
{
return -1;
}
if(num > r->head - r->tail)
{
num = r->head - r->tail;
}
r->head = r->head - num;
return 0;
}
int8_t RINGBUF_GetFill(RINGBUF *r)
{
if(r->head > r->tail)
{
return r->head - r->tail;
}
else return r->size - r->tail + r->head;
}
#ifndef RINGBUFF_C_
#define RINGBUFF_C_
#include "stdint.h"
#include "main.h"
typedef struct
{
uint8_t *pt;
uint32_t tail;
uint32_t head;
uint32_t size;
}RINGBUF;
extern RINGBUF RX_BUF;
int32_t RINGBUF_Init(RINGBUF *r, uint8_t *buf,uint32_t size);
int8_t RINGBUF_Put(RINGBUF *r, uint8_t c);
int32_t RINGBUF_Get(RINGBUF r, uint8_t c);
int8_t RINGBUF_Clear(RINGBUF *r, uint8_t num);
int8_t RINGBUF_GetFill(RINGBUF *r);
#endif /* RINGBUFF_C_ */
将循环队列加入到串口中断中
void uart0_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
if(p_args->event == UART_EVENT_RX_CHAR)
{
tempRX = (uint8_t)p_args->data;
RINGBUF_Put(&RX_BUF, tempRX);
}
}
主函数中添加如下功能即可
void hal_entry(void)
{
/* TODO: add your own code here */
hal_systick_init();
UART0_Init();
uint8_t txData;
printf("测试循环队列收发功能===\r\n");
while(1)
{
if(RINGBUF_Get(&RX_BUF,&txData) == 0)
{
uart0_Send_Byte(txData);
}
}
}
编译后烧录代码
打开串口助手,设置波特率115200

可以看到,满足实验要求
你好,瑞萨电子,RA生态工作室 ,电子发烧友

欢迎使用RA6E2地奇星开发板
附件是代码工程,这里无私奉献给RA生态工作室,希望采纳!!!!
*附件:RA6E2_UART.zip