瑞萨单片机论坛
直播中

jf_43382582

1年用户 321经验值
擅长:可编程逻辑 嵌入式技术 EMC/EMI设计 存储技术
私信 关注
[经验]

【瑞萨RA6E2地奇星开发板试用】+ 4.使用循环队列将串口接收到的数据一个不丢的发送出去

1174ab40659ac7625f79387bfe086c94

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

还是先上个美女镇楼吧!

78a1a24bce1f5c8fe7f64581435d19c9.png

好了,先打开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

image.png

可以看到,满足实验要求

你好,瑞萨电子,RA生态工作室 ,电子发烧友

image.png

欢迎使用RA6E2地奇星开发板

附件是代码工程,这里无私奉献给RA生态工作室,希望采纳!!!!
*附件:RA6E2_UART.zip

更多回帖

发帖
×
20
完善资料,
赚取积分