0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于环形队列的UART收发回显实验

瑞萨嵌入式小百科 来源:瑞萨嵌入式小百科 2025-10-27 13:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

18.7

实验3:基于环形队列的UART收发回显

在实际项目开发中,由于有些串口不具备FIFO(如SCI1和SCI2)或FIFO的buffer比较小,这可能会在数据处理速度小于数据接收速度的时候,导致数据的丢失。因此我们可以设计一个队列来避免这一问题。在本实验中,我们使用环形队列来实现实验1的串口收发回显,将串口接收到的数据暂存在队列中,待完成一次接收后再将队列中的数据全部发出去。

队列是一种特殊的线性表,只允许在队列头(head)删除元素,在队列尾(tail)添加元素。当队列添加一个元素,队列尾向后移动,当队列删除一个元素,同样,删除一个元素,队列头向后移动,如图19_18。

a5979420-b2eb-11f0-8c8f-92fbcf53809c.png

图19-18 队列图示

由于存储空间是有限的,如果使用线性队列,删除元素后就会空出一段存储空间,这会造成很大的浪费。因此实际上我们更多使用环形队列。并不是说这段存储空间是环形的,而是头指针和尾指针到达存储空间末尾后会回到存储空间起点。因此在逻辑上这是循环的,如图19_19。

a5f75432-b2eb-11f0-8c8f-92fbcf53809c.png

图19-19 环形队列

18.7.1

硬件设计

本实验使用到开发板的串口和LED灯,其原理图在本章实验1和前面的点亮LED灯章节有介绍,这里不进行赘述。

18.7.2

软件设计

18.7.2.1

新建工程

因为本节的UART实验例程与上一个实验例程的FSP配置以及UART相关的一些代码基本一致,因此我们可以直接以前面的“19_UART_Receive_Send”工程为基础进行修改。

对于e2studio开发环境:拷贝一份我们之前的e2s工程模板“19_UART_Receive_Send”,然后将工程文件夹重命名为“19_UART_Circular_Queue”,最后再将它导入到我们的e2studio工作空间中。

对于Keil开发环境:拷贝一份我们之前的Keil工程模板“19_UART_Receive_Send”,然后将工程文件夹重命名为“19_UART_Circular_Queue”,并进入该文件夹里面双击Keil工程文件,打开该工程。

FSP配置完全一致,因此我们省略掉这部分。

18.7.2.2

环形队列的实现

列表8:代码清单19-7:环形队列头文件内容

左右滑动查看完整内容

#defineDATA_LEN300//队列缓存大小
typedefstruct
{
uint16_thead;//头指针
uint16_ttail;//尾指针
uint8_tdata[DATA_LEN];//队列数据
}Circular_queue_t;
externCircular_queue_tCircular_queue;//环形队列全局变量
boolQueue_Init(Circular_queue_t*circular_queue);//初始化队列
boolQueue_isEmpty(Circular_queue_t*circular_queue);//判断队列是否为空
boolQueue_isFull(Circular_queue_t*circular_queue);//判断队列是否已满
boolQueue_Wirte(Circular_queue_t*circular_queue,uint8_t*string, uint16_
→t len);//写数据
boolQueue_Read(Circular_queue_t*circular_queue,uint8_t*string,uint16_t␣
→len);//读数据
uint16_tQueue_HadUse(Circular_queue_t *circular_queue);//返回队列中数据的长度
uint16_tQueue_NoUse(Circular_queue_t*circular_queue);//返回未使用数据的长度

环形队列相关函数的具体定义可以在例程的circular_queue.c中查看,这里就不赘述了。

18.7.2.3

串口中断回调函数

debug_uart4_callback串口中断回调函数的内容修改成如下所示。

列表9:代码清单19-8:串口中断回调函数

左右滑动查看完整内容

/*串口中断回调*/
voiddebug_uart4_callback(uart_callback_args_t* p_args)
{
switch(p_args->event)
{
caseUART_EVENT_RX_CHAR:
{
/*接收到数据后马上写入队列中*/
Queue_Wirte(&Circular_queue,(uint8_t*) &p_args->data,1);
break;
}
caseUART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag=true;
break;
}
default:
break;
}
}

18.7.2.4

hal_entry入口函数

hal_entry入口函数的内容修改成如下所示。

列表10:代码清单19-9:hal_entry入口函数

左右滑动查看完整内容

voidhal_entry(void)
{
/*TODO:add your own code here */
uint8_tRead_Buffer[DATA_LEN];
uint16_tRead_Length;
LED_Init();
// LED 初始化
Debug_UART4_Init();// SCI4 UART 调试串口初始化
Queue_Init((Circular_queue_t*)&Circular_queue);//环形队列初始化
printf("这是一个串口环形队列例程
");
printf("打开串口助手发送数据 5 个及以上的数据,接收窗口会打印所发送的数据
");
while(1)
{
if(Queue_isEmpty(&Circular_queue) ==false)//判断队列中的数据不为空
{
Read_Length =Queue_HadUse(&Circular_queue);
if( Read_Length >=5)
// 如果队列中的数据大于等于 5 个,开始打印
队列中的所有数据
{
printf("Read_Length=%d: ", Read_Length);
memset(Read_Buffer,0, DATA_LEN);
/* 读出 Read_Length 个数据 */
Queue_Read(&Circular_queue, Read_Buffer, Read_Length);
printf("%s
", Read_Buffer);
 }
}
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

18.7.3

下载验证

保证开发板相关硬件连接正确,用Type-CUSB线连接开发板“USBTOUART”接口电脑。本次实验需要使用到串口调试助手,配置好串口参数并打开串口后,在调试助手的发送区域输入超过5个的任意字符并点击发送,即可在接收区看见返回字符,不一定马上全部返回全部的已发送的字符,可以多发送几次数据观察,数据并没有丢失。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led灯
    +关注

    关注

    22

    文章

    1604

    浏览量

    111195
  • fifo
    +关注

    关注

    3

    文章

    406

    浏览量

    45503
  • 串口
    +关注

    关注

    15

    文章

    1607

    浏览量

    81965
  • uart
    +关注

    关注

    22

    文章

    1304

    浏览量

    106130

原文标题:实验3:基于环形队列的UART收发回显——瑞萨RA系列FSP库开发实战指南(49)

文章出处:【微信号:瑞萨嵌入式小百科,微信公众号:瑞萨嵌入式小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    UART波特率计算及UART收发回实验

    决定串口波特率的寄存器有BRR(Bite Rate Rigister),SEMR(Serial Extended Mode Rigister)和MDDR(Modulation Duty Register)。波特率与寄存器的值的公式如图19_8 所示。N表示BRR寄存器的值,B是波特率,PCLK 是外设时钟的频率(单位:MHz)。BGDM(Baud Rate Generator Double-Speed Mode Select)在RA6M5中,SCI挂载在PHBIU(Peripheral High Speed Bus Interface Unit)总线上,使用时钟PCLKA,该时钟默认频率为100MHz。
    的头像 发表于 10-17 09:51 2415次阅读
    <b class='flag-5'>UART</b>波特率计算及<b class='flag-5'>UART</b><b class='flag-5'>收发回</b><b class='flag-5'>显</b><b class='flag-5'>实验</b>

    基于STM32的串口环形队列IAP调试

    基于STM32的串口环形队列IAP调试心得
    的头像 发表于 09-18 15:33 2407次阅读
    基于STM32的串口<b class='flag-5'>环形</b><b class='flag-5'>队列</b>IAP调试

    环形队列在串口数据接收中的使用

    前言  书接上回,前文主要介绍了环形队列的实现原理以及C语言实现及测试过程,本文将回归到嵌入式平台的应用中,话不多说,淦,上干货!实验目的HAL库下串口的配置及使用环形
    发表于 12-06 06:27

    如何使用队列实现STM32串口环形缓冲?

    串口环形缓冲的好处是什么?如何使用队列实现STM32串口环形缓冲?
    发表于 12-07 07:13

    如何将DMA和环形的FIFO队列结合在一起来使用呢

    如何将DMA和环形的FIFO队列结合在一起来使用呢?有哪些实验步骤呢?
    发表于 12-09 08:05

    实现队列环形缓冲的方法

    串口队列环形缓冲区队列串口环形缓冲的好处代码实现队列  要实现队列
    发表于 02-21 07:11

    环形队列的相关资料分享

    前言  当代码,不再是简单的完成需求,对代码进行堆砌,而是开始思考如何写出优美代码的时候,我们的代码水平必然会不断提升,今天,咱们来学习环形队列结构。环形队列的基本概念  相信对数据结
    发表于 02-23 06:10

    环形队列的操作如何去实现呢

    环形队列结构的定义是什么?环形队列的操作如何去实现呢?
    发表于 02-25 06:35

    深度解析数据结构与算法篇之队列环形队列的实现

    的位置。 02 — 环形队列的实现 要想将元素放入队列我们必须知道对头和队尾,在队列长度不能无限大的条件下我们还要知道队列的最大容量,我们还
    的头像 发表于 06-18 10:07 2418次阅读

    【STM32+cubemx】0005 HAL库开发:uart串口中断和fifo环形队列

    上一节我们学习了串口的轮询收发,以及HAL库自带的中断收发。也分析了优缺点,这一节我们来讲讲如何改写HAL库函数,使它能更高效地收发数据,更方便地使用。早些年在使用51单片机、AVR单片机的时候
    发表于 11-15 20:36 39次下载
    【STM32+cubemx】0005 HAL库开发:<b class='flag-5'>uart</b>串口中断和fifo<b class='flag-5'>环形</b><b class='flag-5'>队列</b>

    基于STM32的串口环形队列IAP调试心得

    使用环形队列,简单点说就是个环形数组,一边接收上位机数据,一边往flash里面写。
    发表于 02-08 15:22 5次下载
    基于STM32的串口<b class='flag-5'>环形</b><b class='flag-5'>队列</b>IAP调试心得

    嵌入式环形队列和消息队列的实现

    嵌入式环形队列和消息队列是实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
    的头像 发表于 04-14 11:52 2330次阅读

    嵌入式环形队列和消息队列是如何去实现的?

    嵌入式环形队列和消息队列是实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
    发表于 05-20 14:55 1605次阅读

    裸机中环形队列与RTOS中消息队列有何区别呢?

    环形队列”和“消息队列”在嵌入式领域有应用非常广泛,相信有经验的嵌入式软件工程师对它们都不陌生。
    的头像 发表于 01-26 09:38 1345次阅读
    裸机中<b class='flag-5'>环形</b><b class='flag-5'>队列</b>与RTOS中消息<b class='flag-5'>队列</b>有何区别呢?

    嵌入式环形队列与消息队列的实现原理

    嵌入式环形队列,也称为环形缓冲区或循环队列,是一种先进先出(FIFO)的数据结构,用于在固定大小的存储区域中高效地存储和访问数据。其主要特点包括固定大小的数组和两个指针(头指针和尾指针
    的头像 发表于 09-02 15:29 1756次阅读