[活动专区] 【杰发科技AC7802x测评】2. 使用printf和scanf重定向串口输入输出

[复制链接]
2163|16
 楼主| hehung 发表于 2023-5-28 11:42 | 显示全部楼层 |阅读模式
#申请原创#
前言

本实验用串口来实现printf输出以及scanf输入。和电脑环境的C语言不一样的是,单片机开发中,printf和scanf的实现是通过串口来完成的,而且不同的IDE的视线方式是不一样的,本文以MDK为例,讲解如何使用串口重定向scanf和printf。

测试环境:

- 系统:win10
- IDE:KEIL V5.34
- 单片机:AC7802X

1 硬件连接

要使用串口功能,首先是查看串口引脚的连接。

查看原理图可知,板载的Type-C连接到了UART1上,所以可以直接通过Type-C来实现串口通信,这点很棒,减少了接线。

1685236840541.png

下图是复用关系,但是不是重点,因为官方提供的例程中已经做好了复用关系的映射,我们只需使用即可。

1685236052192.png

2 代码实现

KEIL下实现printf和scanf的串口重定向,需要实现fputc和fgetc函数,用于输出和输入一个字符,实现如下:

  1. /*
  2. @hehung
  3. 2023-5-22
  4. email: 1398660197@qq.com
  5. wechat: hehung95
  6. reproduced and please indicate the source @hehung
  7. */

  8. #include <stdbool.h>
  9. #include "ac780x_gpio.h"
  10. #include "ac780x_uart.h"
  11. #include "ac780x_uart_reg.h"
  12. #include "app_uart.h"


  13. // UART initialization
  14. void UART_Cfg_Init(void)
  15. {
  16.     UART_ConfigType uart_config;

  17.     GPIO_SetFunc(GPIOA, GPIO_PIN4, GPIO_FUN3);    /*! uart tx */
  18.     GPIO_SetFunc(GPIOA, GPIO_PIN5, GPIO_FUN3);    /*! uart rx */

  19.     uart_config.baudrate   = 115200;              /*!  baudrate 115200 */
  20.     uart_config.dataBits   = UART_WORD_LEN_8BIT;  /*! data leng th8bit */
  21.     uart_config.stopBits   = UART_STOP_1BIT;      /*! 停止位1bit */
  22.     uart_config.fifoByteEn = DISABLE;   
  23.     uart_config.sampleCnt  = UART_SMP_CNT0;       /*! 16倍采样 */
  24.     uart_config.callBack   = NULL;                /*! 不设置回调函数 */

  25.     UART_Init(UART1,&uart_config);
  26. }

  27. // fputs for printf or other print function in standard
  28. int fputc(int ch, FILE *f)
  29. {
  30.     UART_SendData(UART1, ch);           /*! 发送数据 */
  31.     while (!UART_TxIsEmpty(UART1)) {};       /*! 等待发送缓冲区为空 */

  32.     return ch;
  33. }

  34. // fgets for scanf or other input function in standard
  35. int fgetc(FILE *f)
  36. {
  37.     (void)f;
  38.     uint8_t ch;

  39.     while(!UART_RxIsDataReady(UART1)) {};    /*! 等待串口1接受到数据 */
  40.     ch = UART_ReceiveData(UART1);       /*! 读取数据 */

  41.     return (int)ch;
  42. }



主函数实现进行测试:
  1. int main(void)
  2. {
  3.     InitDelay();
  4.   
  5.     UART_Cfg_Init();                          /*! 串口1初始化 */

  6.     printf ("This is a printf and scanf TEST for ac7802x\r\n");
  7.     int a;
  8.     printf ("Please input a number with int type\r\n");
  9.     scanf ("%d", &a);
  10.     printf ("The number you input is: %d\r\n", a);

  11.     while(1)
  12.     {
  13.    
  14.     }
  15. }



# 3 注意事项

## 3.1 勾选Use MicroLIB

需要使用KEIL下的printf和scanf功能,还需要勾选 `Use MicroLIB`,不然程序会卡死。

1685236269301.png

# 4 实验效果

如下为测试结果,可以看到,试验成功,后续就可以使用printf来输出一些调试信息,使用scanf来接受控制命令进行调试了。

1685236604957.png






GrootBrain 发表于 2023-5-30 06:33 | 显示全部楼层
感谢楼主分享
olivem55arlowe 发表于 2023-6-10 09:43 | 显示全部楼层
scanf函数是可以进行命令行输入吗

评论

是的,但是使用scanf的时候,串口输入的命令需要带有回车  发表于 2023-6-11 15:22
updownq 发表于 2023-6-10 09:59 | 显示全部楼层
scanf和printf的区别及用法是什么?

评论

scanf是输入,和学习C语言的时候使用的scanf输入是一样的用法,只不过单片机上使用scanf用的是串口来输入命令。printf是打印,将串口重定向到printf,方便打印输出,便于调试分析  发表于 2023-6-11 15:23
mikewalpole 发表于 2023-6-10 10:06 | 显示全部楼层
字符串的输出是否可用scanf()和printf()函数?

评论

可以,scanf和printf是标准C语言的函数,字符,数字,字符串,浮点数,十六进制等都是可以输出与输入的  发表于 2023-6-11 15:24
louliana 发表于 2023-6-10 10:12 | 显示全部楼层
scanf函数和printf函数的功能以及使用时要注意什么问题?

评论

功能就是scanf接收串口收到的数据,使用scanf更加了灵活,printf就是通过串口打印数据或者字符(串)  发表于 2023-6-11 15:26
uiint 发表于 2023-6-10 10:47 | 显示全部楼层
为什么用printf重定向到串口第一个字符打印不出

评论

不知道具体是什么情况,一般情况下是不会的  发表于 2023-6-11 15:27
elsaflower 发表于 2023-6-10 11:10 | 显示全部楼层
printf和scanf是C语言中常用的输入输出函数,可以通过重定向输入输出流来将它们与串口进行通信。
janewood 发表于 2023-6-10 11:15 | 显示全部楼层
sprintf、fprintf和printf这三个函数有什么区别?

评论

sprintf这个在单片机中比较常用,可以将字符,数字,字符串或者其他格式的数据重新格式化组合成一个字符串。 fprintf这个单片机中一般较少使用,目的在于输出到一个文件,单片机中一般没有文件系统,所以用的很少 printf主要用于打印,在单片机中,需要对printf进行输出流的重定向,不同的编译器方法不一样,一般重定向导串口,便于串口输出  发表于 2023-6-11 15:30
beacherblack 发表于 2023-6-10 11:52 | 显示全部楼层
在使用重定向功能时,需要确保串口连接正常并且串口配置正确
houjiakai 发表于 2023-6-10 12:02 | 显示全部楼层
如果有多个串口或需要同时进行输入输出操作,还需要设置不同的文件描述符和缓冲区来避免冲突和阻塞。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

66

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部