查看: 1917|回复: 1

【瑞萨RA2系列开发板体验】+串口发送及接收(以\r\n为结束符)

[复制链接]

93

主题

136

帖子

8万

积分

管理员

11111

Rank: 9Rank: 9Rank: 9

积分
84460
QQ
发表于 2022-5-30 10:52:46 | 显示全部楼层 |阅读模式

【瑞萨RA2系列开发板体验】+串口发送及接收(以\r\n为结束符)

作者:qjp1988113

今天测试下RA2L1_48PIN的串口的收发~我们这了就是最简单的模式,不用FIFO~
接收不开定时器判断,以“\r\n”作为判断的结束符~
我们在上一节的例程上进行修改~上一节,我们已经配置好了LED及GPT0.下面我们开始添加串口的配置:


在config文件的配置区域:
我们点击Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。就只用上面的那个基本的,下面2个不用添加~

选择最上面的基本的模块,开始配置属性:

  1. /*
  2. * uart0_printf.h
  3. *
  4. *  Created on: 2021年12月1日
  5. *      Author: Administrator
  6. */

  7. #ifndef UART0_PRINTF_H_
  8. #define UART0_PRINTF_H_

  9. #include "hal_data.h"
  10. #include "stdio.h"


  11. #define USART_REC_LEN           200     //定义最大接收字节数 200
  12. uint8_t USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  13. //接收状态
  14. //bit15,    接收完成标志
  15. //bit14,    接收到0x0d
  16. //bit13~0,  接收到的有效字节数目
  17. uint16_t  USART_RX_STA;       //接收状态标记

  18. extern volatile bool uart_send_complete_flag;

  19. fsp_err_t uart0_Init(void);


  20. #endif /* UART0_PRINTF_H_ */
复制代码
C文件:
  1. /*
  2. * uart0_printf.c
  3. *
  4. *  Created on: 2021年12月1日
  5. *      Author: Administrator
  6. */


  7. #include "uart0_printf.h"

  8. fsp_err_t err = FSP_SUCCESS;
  9. volatile bool uart_send_complete_flag = false;
  10. uint8_t USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  11. uint16_t  USART_RX_STA=0;       //接收状态标记

  12. #if 1
  13. #ifdef __GNUC__                                 //串口重定向
  14.     #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  15. #else
  16.     #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  17. #endif

  18. PUTCHAR_PROTOTYPE
  19. {
  20.         err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
  21.         if(FSP_SUCCESS != err) __BKPT();
  22.         while(uart_send_complete_flag == false){}
  23.         uart_send_complete_flag = false;
  24.         return ch;
  25. }

  26. int _write(int fd,char *pBuffer,int size)
  27. {
  28.     for(int i=0;i<size;i++)
  29.     {
  30.         __io_putchar(*pBuffer++);
  31.     }
  32.     return size;
  33. }
  34. #endif

  35. fsp_err_t uart0_Init(void)
  36. {
  37.       /* Initialize UART channel with baud rate 115200 */
  38.       err = R_SCI_UART_Open (&g_uart0_ctrl, &g_uart0_cfg);
  39.       if (FSP_SUCCESS != err)
  40.       {
  41.           return err;
  42.       }
  43.       return err;
  44. }


  45. void user_uart_callback (uart_callback_args_t * p_args)
  46. {
  47.     uint8_t res=0;//缓存接收

  48.     if(p_args->event == UART_EVENT_TX_COMPLETE)
  49.     {
  50.         uart_send_complete_flag = true;
  51.     }
  52.     if(p_args->event ==     UART_EVENT_RX_CHAR)
  53.     {
  54.         res = p_args->data;

  55.         if((USART_RX_STA&0x8000)==0)//接收未完成
  56.         {
  57.             if(USART_RX_STA&0x4000)//接收到了0x0d
  58.             {
  59.                 if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  60.                 else USART_RX_STA|=0x8000;  //接收完成了
  61.             }
  62.             else //还没收到0X0D
  63.             {
  64.                 if(res==0x0d)USART_RX_STA|=0x4000;
  65.                 else
  66.                 {
  67.                     USART_RX_BUF[USART_RX_STA&0X3FFF]=res ;
  68.                     USART_RX_STA++;
  69.                     if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
  70.                 }
  71.             }
  72.         }
  73.     }
  74. }
复制代码
我们重定向了Printf,除了添加上述代码,还要加大栈值,及开启printf支持:
我们打开项目设置:

打开下图选择的位置(C++ 构建->设置->GNU ARM Cross C Linker->Miscellaneous)
1、勾选printf float的选项
2、去掉Other linker flags中的 “--specs=rdimon.specs”


主要代码中要添加printf头文件支持:#include <stdio.h>。
我们设置一个发送成功的标志,当发送成功后,就在串口中断函数里面将其置位为
TRUE.
我们发送完字符后,就等待这个标志,一旦置位就发送结束~
至于接收,我们在接收中断中,将每个字符与结束符"\r\n“比较。
并将其保存至缓存数组。一旦符合结束符,就标志接收完成~
在main的while循环中,我们查询接收完成标志,一旦完成就把接收的字符答应出来。
在hal_entry(void)种的具体代码:
  1. void hal_entry(void)
  2. {
  3.     /* TODO: add your own code here */
  4.     uint8_t level=0;
  5.     uint16_t  i,t;
  6.     uint16_t len;
  7.     uint16_t times=0;
  8.     fsp_err_t err = FSP_SUCCESS;

  9.     LED_Init();
  10.     uart0_Init();
  11.     //GPT0_Init();

  12. #if BSP_TZ_SECURE_BUILD
  13.     /* Enter non-secure code */
  14.     R_BSP_NonSecureEnter();
  15. #endif

  16.     while(1)
  17.     {
  18.         if(USART_RX_STA&0x8000)
  19.         {
  20.             len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度

  21.             printf("length=%d\r\n",len);
  22.             printf("\r\n您发送的消息为:\r\n\r\n");
  23.             //用R_SCI_UART_Write实现
  24.             err = R_SCI_UART_Write(&g_uart0_ctrl, USART_RX_BUF, len);
  25.             if(FSP_SUCCESS != err) __BKPT();
  26.             while(uart_send_complete_flag == false){}
  27.             uart_send_complete_flag = false;

  28. //            for(int i=0;i<len;i++)
  29. //                printf("data:[%c] = 0x%x\r\n",i,USART_RX_BUF[i]);
  30. //            memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));  //清空缓存数组

  31.            // printf("%s",USART_RX_BUF);
  32.             printf("\r\n\r\n");//插入换行
  33.             USART_RX_STA=0;
  34.         }else
  35.         {
  36.             times++;
  37.             if(times%5000==0)
  38.             {
  39.                 printf("\r\nRA2L1_PIN48 串口实验\r\n");
  40.                 printf("qjp1988113@bbs.elecfans\r\n");
  41.             }
  42.             if(times%200==0){printf("请输入数据,以回车键结束\n");}
  43.             if(times%30==0){level=1-level;LED2_CTR(level);}//闪烁LED,提示系统正在运行.
  44.             delay_ms(10);
  45.         }
  46.     }
  47. }
复制代码
对外设全部建立独立文档,方便移植

其中调试过程中发送了个小插曲,就是死活接收不到串口发的数据。反复检查代码没有问题。后来发现是TTL串口模块的问题,CP2102就会出现这样的问题,需将接受引脚下拉即可解决问题~
我们下载,查看串口状况:


这了推荐一个串口调试助手,支持UTF8,且支持转译字符(\r,\n,\t)等直接输入即可。
一句话,好使:下载地址:https://singtown.com/singtownserialport/
好了,串口就到这了。
总体而言,上手了E2 STUDIO及熟悉了RA2L1的库函数体系后,编程效率还是可以的~
RA2L1目前就先告一段落了,最近有事了。
好了,谢谢大家观看~有空再会~
SCR文件夹:





















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

3

主题

195

帖子

1168

积分

金牌会员

Rank: 6Rank: 6

积分
1168
发表于 2023-3-14 11:41:20 | 显示全部楼层

不错,学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:134精华:0

RA_Lance

主题: 93帖子:136精华:9

lugl

主题: 52帖子:150精华:1

xujiwei263

主题: 18帖子:86精华:0

Juggernaut

主题: 12帖子:118精华:0

books咦

主题: 11帖子:11精华:2
快速回复 返回顶部 返回列表