细说MCU串口函数及使用printf函数实现串口发送数据的方法

目录

1、硬件及工程 

2、串口相关的库函数

(1)串口中断服务函数:

(2)串口接收回调函数:

(3)串口接收中断配置函数:

(4)非中断发送:

(5)中断发送:

3、使用printf函数串口发送数据

(1)包含头文件

(2)修改发送字符函数putchar()

(3)修改3

(4)修改4

4、下载运行


1、硬件及工程 

        文章依赖的硬件及工程配置同本文作者的其他文章:细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112

2、串口相关的库函数

        MCU串口通讯用到的HAL库函数有下面几个:

(1)串口中断服务函数:

HAL_UART_IRQHandler(UART_HandleTypeDef *huart)

(2)串口接收回调函数:

HAL_UART_R×CpltCallback(UART_HandleTypeDef *huart)

(3)串口接收中断配置函数:

HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size)

(4)非中断发送:

HAL_UART_Transmit(*huart,pData,Size,Timeout)

(5)中断发送:

HAL_UART_Transmit_IT(*huart,pData,Size)

3、使用printf函数串口发送数据

        在MCU中,可以利用printf函数将信息送到MCU的外设上。比较常用的场合就是通过串口发送数据。

(1)包含头文件

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

(2)修改发送字符函数putchar()

        由于STM32CubeIDE使用的是GNU C/C++编译器,所以printf使用的底层函数是putchar函数,具体来说就是__io_putchar(int ch)。

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	CommFlag = 1;
	HAL_UART_Receive_IT(&huart2,(uint8_t *)RxBuffer,RXBUFFERSIZE);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_RESET);
	HAL_Delay(100);	//延时
	HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_SET);

	for(uint8_t i = 0; i < RXBUFFERSIZE; i++)
	{
		printf(" RxBuffer[%d] = 0x%02x\r\n",i,RxBuffer[i]);
	}
}

int __io_putchar(int ch)		//putchar实现
{
    HAL_UART_Transmit(&huart2,(uint8_t*)&ch,1,0xFFFF);
    return ch;
}
/* USER CODE END 4 */

        需要把上面的实现代码放到注释对中。可以放到注释对/*USER CODEBEGIN 4*/和/*USER CODE END 4 */之间。与前面介绍的两个回调函数HAL_UART_RxCpltCallback()和HAL_GPIO_ EXTI_Callback()放到一起。

        在上面putchar函数的定义中,串口发送函数使用的是库函数HAL_UART_Transmit(),每次发送1字节的数据。

        完成上面的工作后,就可以使用printf函数通过串口发送数据了。

(3)修改3

/* USER CODE BEGIN PV */
uint8_t CommOkMessage[] = "Everything is OK\r\n";
uint8_t CommErrMessage[] = "Received Error Data\r\n";
uint8_t CommFlag =0;
uint8_t RxBuffer[RXBUFFERSIZE] = {0};
/* USER CODE END PV */

(4)修改4

        本文例子实现如下功能:程序执行后,MCU首先通过串口发送提示字符串“Please Enter Data:”;随后,等待接收数据;MCU通过中断接收到3字节数据后,会将它们存储到RxBuffer数组中;最后,利用按键B1来查看送来的数据,即在按下B1键后,通过串口送出RxBuffer数组中接收到的数据。

        要实现上述功能,首先要在while(1)循环前使用printf函数通过串口送出提示输入数据的信息:

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  printf("Please Enter Data:\r\n");

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	if ((RxBuffer[0] == 0x53) && (RxBuffer[2] == 0x45) && (CommFlag == 1))
	{
		CommFlag = 0;
		printf("Everything is OK!:\r\n");
		if(RxBuffer[1] == 0x10)
		{
			HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
			//HAL_UART_Transmit(&huart2,CommOkMessage,19,1000);
		}
		else
		{
			HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
			//HAL_UART_Transmit_IT(&huart2,CommErrMessage,22);
		}
	}
  }
  /* USER CODE END 3 */

        然后,修改按键中断处理的回调函数HAL_GPIO_EXTI_Callback(),加入串口发送数据的代码。具体实现如上面第(2)步。

4、下载运行

        在printf函数中,%d是按整型数据输出,%x是按十六进制格式输出,%02x中的02表示位宽为2,不够的话前边补0。

        编译、下载、运行程序后,在串口助手的接收区,会看到提示输入数据的字符“Please Enter Data:”。通过串口助手按十六进制格式送出数据53 10 45后,串口助手会接收到字符“Everything is OK”,表示数据已经正确收到。如果想查看具体收到的是什么数据,可以按一下NUCLEO-G474RE板上的B1键,在串口助手上就会显示所接收到的数据。

        准备就绪,会收到消息“Please Enter Data:” 

        连续发送3次数据53 10 45 ,会收到3次数据正确的消息“Everything is OK”

        

        连续发送4次数据53 10 45 ,会收到4次数据正确的消息“Everything is OK” ,并不是程序写错了,而是程序没写判断数据的对错,程序只是判断数据是否准备妥当了。妥当了,就OK。

      

        按下B1键,看看MCU接收到了什么数据并显示到串口助手上,按一下B1显示一次。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706198.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python:faces swap

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; 两个头像图片之间换脸 # 描述&#xff1a; https://stackoverflow.com/questions/902761/saving-a-numpy-array-as-an-image?answertabvotes # Author : geovindu,Geovin Du 涂聚文. #…

低成本,高性能:10 万美元实现Llama2-7B级性能

高性能的语言模型如Llama2-7B已经成为推动自然语言处理技术进步的重要力量。然而&#xff0c;这些模型往往需要昂贵的计算资源和庞大的研发投入&#xff0c;使得许多研究团队和小型企业望而却步。现在&#xff0c;JetMoE架构以其创新的设计和优化策略&#xff0c;不仅成功地在只…

PC微信逆向) 定位微信浏览器打开链接的call

首发地址: https://mp.weixin.qq.com/s/Nik8fBF3hxH5FPMGNx3JFw 前言 最近想写一个免费的微信公众号自动采集的工具&#xff0c;我看公众号文章下载需求还挺多的。搜了下github&#xff0c;免费的工具思路大多都是使用浏览器打开公众号主页获取到需要的请求参数&#xff0c;例…

云化XR什么意思,Cloud XR是否有前景?

云化XR&#xff08;CloudXR&#xff09;什么意思&#xff1f; 云化XR&#xff08;CloudXR&#xff09;是一种基于云计算技术的扩展现实&#xff08;XR&#xff09;应用方式&#xff0c;将XR体验从本地设备转移到云端进行处理和交付。它通过将计算和渲染任务放置在云端服务器上…

Linux基础IO【II】真的很详细

目录 一.文件描述符 1.重新理解文件 1.推论 2.证明 2.理解文件描述符 1.文件描述符的分配规则 3.如何理解文件操作的本质&#xff1f; 4.输入重定向和输出重定向 1.原理 2.代码实现重定向 3.dup函数 ​编辑 4.命令行中实现重定向 二.关于缓冲区 1.现象 …

Modbus转Profinet网关的IP地址怎么设置

在工业自动化领域&#xff0c;Modbus和Profinet是两种常用的通信协议&#xff0c;而网关可以实现不同协议之间的转换&#xff0c;使得不同设备能够互相通信。本文将详细介绍如何设置Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;的IP地址&#xff0c;让您轻松实现设…

vue相关的2个综合案例,网页打字练习

for循环的应用 /* 1. 用for循环控制台打印0到100 */ for (var i 0; i < 100; i) {console.log(i) } /* 2. 用for循环控制台打印100到0 */ for (var i 100; i > 0; i--) {console.log(i) }网页打字练习案例练习 <template><div class"main"><…

洛谷P1305 新二叉树(树的基本遍历)

题目描述 输入一串二叉树&#xff0c;输出其前序遍历。 输入格式 第一行为二叉树的节点数 &#x1d45b;。(1≤&#x1d45b;≤26) 后面 &#x1d45b; 行&#xff0c;每一个字母为节点&#xff0c;后两个字母分别为其左右儿子。特别地&#xff0c;数据保证第一行读入的节点…

IPTCP知识

1. IP&#xff1a; IP地址是一个32位的二进制数&#xff0c;通常被分割为4个“8位二进制数”IP地址分类&#xff1a;A类地址、B类地址、C类地址、D类地址、E类地址 A类地址分配给规模特别大的网络使用&#xff0c;B类地址分配给一般的中型网络&#xff0c;C类地址分配给小型网…

STM32无法烧写程序的故障排除

如果你在使用STM32微控制器时遇到无法烧写程序的问题&#xff0c;可以按以下步骤进行故障排除&#xff1a; 1. 确认硬件连接 检查电源&#xff1a;确保STM32板子正确供电。调试器连接&#xff1a;确认ST-LINK调试器或其他编程工具与STM32开发板的连接无误&#xff0c;尤其是S…

如何基于 Python 快速搭建 QQ 开放平台 QQ 群官方机器人详细教程(更新中)

注册 QQ 开放平台账号 账号注册 QQ 机器人&#xff1a;一个机器人可以被添加到 群聊/频道 内对话&#xff0c;QQ 用户也可以直接跟机器人 单独对话。 开发者账号主体要求 单聊对话&#xff1a;【定向邀请】 群聊场景&#xff1a;仅支持企业主体【个人主体暂不支持】 频道场…

基于uni-app与图鸟UI打造的各领域移动端模板大赏

随着移动互联网的迅猛发展&#xff0c;各类移动端应用层出不穷&#xff0c;为了帮助企业快速搭建高效、美观的移动平台&#xff0c;我们基于强大的uni-app与图鸟UI&#xff0c;精心打造了不下于40套覆盖多个领域的移动端模板。今天&#xff0c;就让我们一起领略这些模板的风采吧…

淘宝镜像地址失效

1. 使用nvm安装node时候报错 报错内容 Get "https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": tls: failed to verify certificate: x509: certificate has expired or is not yet valid:报错原因 淘宝镜像地址的证书过期了 解决 找到nvm安装的根目…

Java-集合类-Arrays.asList()使用需要注意的大坑

Arrays.asList使用需要注意的大坑 大坑1.不可修改列表大小&&原始数组与列表共享数据2.对于基本类型数组的使用限制 两个错误案例wrong1wrong2 ​ Arrays.asList() 是 Java 中一个常用的方法&#xff0c;它 用于将数组转换为列表&#xff08;List&#xff09;。这个方…

Bybatis动态SQL的绑定和公共sql语句片段

Mybatis除了大部分动态标签&#xff0c;最后还有三个标签&#xff0c;分别是bind&#xff0c;sql和include&#xff1a; ①bind&#xff1a;这个标签作用就是将OGNL标签里的值&#xff0c;进行二次加工&#xff0c;在绑定到另一个变量里&#xff0c;供其他标签使用 调用getUse…

Java—集合简述

集合类继承结构图 Collection|---------------------| | | Set List Queue| | | SortedSet ArrayList Deque| LinkedList | NavigableSet Vector ArrayDeque| Stack | TreeSet …

数据结构笔记-2、线性表

2.1、线性表的定义和基本操作 如有侵权请联系删除。 2.1.1、线性表的定义&#xff1a; ​ 线性表是具有相同数据类型的 n (n>0) 个数据元素的有限序列&#xff0c;其中 n 为表长&#xff0c;当 n 0 时线性表是一个空表。若用 L 命名线性表&#xff0c;则其一般表示为&am…

【软件工程导论】——期末复习(冲刺篇)

&#x1f4d6; 前言&#xff1a;快考试了&#xff0c;做篇期末总结&#xff0c;都是重点与必考点。 题型&#xff1a;材料分析题、简答题、看图分析题 课本&#xff1a; 目录 &#x1f552; 1. 软件生存周期与软件过程&#x1f558; 1.1 软件生存周期&#x1f558; 1.2 传统…

Java老人护理上门服务类型系统小程序APP源码

&#x1f338; 老人上门护理服务系统&#xff1a;温暖与专业并存 &#x1f338; 一、&#x1f3e0; 走进老人上门护理服务系统 随着社会的快速发展&#xff0c;我们越来越关注老年人的生活质量。老人上门护理服务系统应运而生&#xff0c;它结合了现代科技与人性化服务&#…

webpack代码分割

webpack代码分割方式 entry配置&#xff1a;通过多个 entry 文件来实现动态加载(按需加载)&#xff1a;通过主动使用import来动态加载抽取公共代码&#xff1a;使用splitChunks配置来抽取公共代码 基础概念 概念含义Entry入口&#xff0c;Webpack 执行构建的第一步将从 Entr…