• 基于STM32之UART串口通信协议(四)Printf发送


    一、前言

    1、简介

      前面在UART发送中已经讲解过如何调用HAL库的HAL_UART_Transmit函数来实现串口发送,而在调用这个函数来实现串口发送的话,但是在发送数据或者字符的时候,需要将数据或字符都先转换成字符并存在一个数组,或者分开发几次,这是会出现一些不便之处,不能像printf一样方便。

      所以这篇博客就说说如何在串口上实现用printf函数来发送,实现方法也非常简单。

    2、UART简介

      嵌入式开发中,UART串口通信协议是我们常用的通信协议之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。

    3、准备工作

      按照UART详解中完成所有配置操作并生成代码,就可以开始下面操作。

    二、代码部分

    1、创建新的“.c”、“.h”文件(命名按照自己习惯)

    2、在“.h”文件中添加(最后需要空出一行)

     1 #ifndef _CORE_PRINTF_H_
     2 #define _CORE_PRINTF_H_
     3 
     4 #include "stdio.h"
     5 #include "Usart.h"
     6 
     7 
     8 
     9 
    10 
    11 
    12 #endif

    3、在“.c”文件中添加(最后需要空出一行)

     1 #include "Core_Printf.h"
     2 
     3 
     4 
     5 #if 1
     6 #pragma import(__use_no_semihosting)             
     7 /* 标准库需要的支持函数 */              
     8 struct __FILE 
     9 { 
    10     int handle; 
    11 }; 
    12 
    13 FILE __stdout;       
    14 /* 定义_sys_exit()以避免使用半主机模式     */
    15 void _sys_exit(int x) 
    16 { 
    17  x = x; 
    18 } 
    19 /* 重定义fputc函数 */
    20 int fputc(int ch, FILE *f)
    21 {
    22     /* 选择USART1发送 */
    23     while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
    24     USART1->DR = (uint8_t) ch;
    25     return ch;
    26 }
    27 #endif

    4、添加Include头文件(在需要调用到的函数中添加)

    1 /* USER CODE BEGIN Includes */
    2 #include "Core_Printf.h"
    3 /* USER CODE END Includes */

    5、整个main函数如下

     1 int main(void)
     2 {
     3   /* USER CODE BEGIN 1 */
     4     
     5   /* USER CODE END 1 */
     6   
     7 
     8   /* MCU Configuration--------------------------------------------------------*/
     9 
    10   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    11   HAL_Init();
    12 
    13   /* USER CODE BEGIN Init */
    14 
    15   /* USER CODE END Init */
    16 
    17   /* Configure the system clock */
    18   SystemClock_Config();
    19 
    20   /* USER CODE BEGIN SysInit */
    21 
    22   /* USER CODE END SysInit */
    23 
    24   /* Initialize all configured peripherals */
    25   MX_GPIO_Init();
    26   MX_USART1_UART_Init();
    27   /* USER CODE BEGIN 2 */
    28 
    29   /* USER CODE END 2 */
    30 
    31   /* Infinite loop */
    32   /* USER CODE BEGIN WHILE */
    33   while (1)
    34   {
    35         /* UART printf发送 */
    36         printf("
    欢迎来到LLLIN000的博客!!");
    37         /* 延迟1s */
    38         HAL_Delay(1000);
    39     /* USER CODE END WHILE */
    40 
    41     /* USER CODE BEGIN 3 */
    42   }
    43   /* USER CODE END 3 */
    44 }

    6、编译、下载烧写

    7、实现效果

    说明:

      按照上面的操作完成后,就可以在串口发送上实现printf的发送功能,非常方便使用。

    三、结尾

     1、总结

      这篇博客补全了 未提及的Printf发送方式,我们可以将这两个代码文件保存下来,日后可以直接在其他项目调用即可。

    2、回顾

    1)UART详解

    2)UART发送

    3)UART接收

    3、后续

    待补充……

    ~

    ~

    ~

    ~

    感谢阅读~

     欢迎大家关注我的博客,一起分享嵌入式知识~

  • 相关阅读:
    react_瞎敲
    linux 删除类似文件
    mysql建立dblink 视图,无法查询到数据的问题
    Guava-Retrying 请求重试机制
    Command line is too long. Shorten command line for WebServiceUtilsTest.callMethod or also for JUnit default
    @Scheduled 定时任务注解不能运行
    jq拷贝表单$("#searchForm").clone(true),无法将select2数据value拷贝的问题
    正则表达式的lookaround(lookahead/lookbehind)以及密码复杂度检查
    MYSQL列的长度,NUMERIC_PRECISION和COLUMN_TYPE
    Qira-docker安装与使用
  • 原文地址:https://www.cnblogs.com/ChurF-Lin/p/11139901.html
Copyright © 2020-2023  润新知