打印
[活动专区]

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

[复制链接]
477|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来实现串口通信,这点很棒,减少了接线。



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



2 代码实现

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

/*
@hehung
2023-5-22
email: 1398660197@qq.com
wechat: hehung95
reproduced and please indicate the source @hehung
*/

#include <stdbool.h>
#include "ac780x_gpio.h"
#include "ac780x_uart.h"
#include "ac780x_uart_reg.h"
#include "app_uart.h"


// UART initialization
void UART_Cfg_Init(void)
{
    UART_ConfigType uart_config;

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

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

    UART_Init(UART1,&uart_config);
}

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

    return ch;
}

// fgets for scanf or other input function in standard
int fgetc(FILE *f)
{
    (void)f;
    uint8_t ch;

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

    return (int)ch;
}



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

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

    while(1)
    {
   
    }
}



# 3 注意事项

## 3.1 勾选Use MicroLIB

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



# 4 实验效果

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








使用特权

评论回复

相关帖子

沙发
GrootBrain| | 2023-5-30 06:33 | 只看该作者
感谢楼主分享

使用特权

评论回复
板凳
olivem55arlowe| | 2023-6-10 09:43 | 只看该作者
scanf函数是可以进行命令行输入吗

使用特权

评论回复
评论
hehung 2023-6-11 15:22 回复TA
是的,但是使用scanf的时候,串口输入的命令需要带有回车 
地板
updownq| | 2023-6-10 09:59 | 只看该作者
scanf和printf的区别及用法是什么?

使用特权

评论回复
评论
hehung 2023-6-11 15:23 回复TA
scanf是输入,和学习C语言的时候使用的scanf输入是一样的用法,只不过单片机上使用scanf用的是串口来输入命令。printf是打印,将串口重定向到printf,方便打印输出,便于调试分析 
5
mikewalpole| | 2023-6-10 10:06 | 只看该作者
字符串的输出是否可用scanf()和printf()函数?

使用特权

评论回复
评论
hehung 2023-6-11 15:24 回复TA
可以,scanf和printf是标准C语言的函数,字符,数字,字符串,浮点数,十六进制等都是可以输出与输入的 
6
louliana| | 2023-6-10 10:12 | 只看该作者
scanf函数和printf函数的功能以及使用时要注意什么问题?

使用特权

评论回复
评论
hehung 2023-6-11 15:26 回复TA
功能就是scanf接收串口收到的数据,使用scanf更加了灵活,printf就是通过串口打印数据或者字符(串) 
7
uiint| | 2023-6-10 10:47 | 只看该作者
为什么用printf重定向到串口第一个字符打印不出

使用特权

评论回复
评论
hehung 2023-6-11 15:27 回复TA
不知道具体是什么情况,一般情况下是不会的 
8
elsaflower| | 2023-6-10 11:10 | 只看该作者
printf和scanf是C语言中常用的输入输出函数,可以通过重定向输入输出流来将它们与串口进行通信。

使用特权

评论回复
9
janewood| | 2023-6-10 11:15 | 只看该作者
sprintf、fprintf和printf这三个函数有什么区别?

使用特权

评论回复
评论
hehung 2023-6-11 15:30 回复TA
sprintf这个在单片机中比较常用,可以将字符,数字,字符串或者其他格式的数据重新格式化组合成一个字符串。 fprintf这个单片机中一般较少使用,目的在于输出到一个文件,单片机中一般没有文件系统,所以用的很少 printf主要用于打印,在单片机中,需要对printf进行输出流的重定向,不同的编译器方法不一样,一般重定向导串口,便于串口输出 
10
beacherblack| | 2023-6-10 11:52 | 只看该作者
在使用重定向功能时,需要确保串口连接正常并且串口配置正确

使用特权

评论回复
11
houjiakai| | 2023-6-10 12:02 | 只看该作者
如果有多个串口或需要同时进行输入输出操作,还需要设置不同的文件描述符和缓冲区来避免冲突和阻塞。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

66

帖子

1

粉丝