瑞萨RA0单片机连载——实现串口重定向之printf

  作者:lulugl 时间:2024-11-22来源:EEPW

1   目的

在单片机的调试中,我们日常的日志输出,通常是通过串口来实现,而通过串口重定向来实现又是常规的操作之一。这次我在前面的基础之上增加了printf 的面向对象的增加这项功能。

2   实现步骤

1.在工程中添加printf.c 函数,并把他加入到libs的分组之中。

1732237973236708.png

2.在工程的设置中,打开Use MincroLIB库。

1732238008386481.png

3.在printf.c中,添加对输入输出的系统头文件<stdio.h>的引用,当然由于我需要调用驱动库要添加<devices.h>以及<hal_data.h>的引用。

4.重写fputc输出,在此函数中,我先查找Log 这个串口的驱动,如果查找到,则使用他的write 进行串口输出,代码如下:

view plaincopy to clipboardprint?

1. int fputc(int ch, FILE *f)

2. {

3. (void)f;

4. struct UartDev *pLogDevice = UartDeviceFind

(“Log”);

5. pLogDevice->Write(pLogDevice, (unsigned

char*)&ch, 1);

6. return ch;

7. }

5.重写scanf 函数,在这个函数中,我也一样先查找以”Log”命名的串口,如果查找到,则使用这个驱动的write 进行输出。其代码如下:

view plaincopy to clipboardprint?

1. int fgetc(FILE *f)

2. {

3. uint8_t ch;

4.

5. (void)f;

6. struct UartDev *pLogDevice = UartDeviceFind

7. /* 启动接收字符 */

8. while(pLogDevice->Read(pLogDevice,

(unsigned char*)&ch, 1) != 1)

9. {}

10. /* 回显 */

11. {

12. fputc(ch, &__stdout);

13.

14. /* 回车之后加换行 */

15. if (ch == ‘r’)

16. {

17. fputc(‘n’, &__stdout);

18. }

19. }

20.

21. return (int)ch;

22. }

6. 驱动设置好后,就可以在工程中使用printf 进行串口输出了。

添加测试代码如下:

view plaincopy to clipboardprint?

1. void led_blink(void)

2. {

3. uint32_t cnt;

4. UartDevicesRegister();

5.

6. LedDevice *pLED = LedGetDevice();

7. if(NULL == pLED)

8. {

9. printf(“Error. There is no LED device!rn”);

10. return;

11. }

12. pLED->Init(pLED);

13.

14. while(1)

15. {

16. cnt++;

17. pLED->On(1);

18. R_BSP_SoftwareDelay(1,BSP_DELAY_

UNITS_SECONDS);

19. pLED->Off (1);

20. R_BSP_SoftwareDelay(1,BSP_DELAY_

UNITS_SECONDS);

21. pLED->On(2);

22. R_BSP_SoftwareDelay(1,BSP_DELAY_

UNITS_SECONDS);

23. pLED->Off (2);

24. R_BSP_SoftwareDelay(1,BSP_DELAY_

UNITS_SECONDS);

25. printf(“run cnt %drn”,cnt);

26.

27. }

28. }

测试结果如下:

1732238117760102.png

3   总结

使用面向对象之编程,可以实现代码的快递移植,当然重写printf 也是非常之简单。

(本文来源于《EEPW》2024年11期)

关键词: 202411 瑞萨 RA0 单片机 printf

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版