当前位置: 首页 > news >正文

STM32F103RCT6学习之三:串口

1.串口基础

 2.串口发送

1)基本配置

 注意:实现串口通信功能需在keil中设置打开Use Micro LIB,才能通过串口助手观察到串口信息

2)编辑代码

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */uint8_t msg[]="Hello World!\n";while (1){/* USER CODE END WHILE */HAL_UART_Transmit(&huart1,msg,sizeof(msg),HAL_MAX_DELAY);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

3)分析 ---关于重定向

huart1是一个串口句柄,定义在usart.c中

如果重定向printf或sprintf,只需要重定义fputc和fgetc()

#include<stdio.h>
int fputc(int ch,FILE *f){HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);return ch;
}
int fgetc(FILE  *f){uint8_t ch;HAL_UART_Receive(&huart1,(uint8_t*)&ch,1,0xffff);return ch;
}

那么主函数可以如下实现::

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */printf("Hello World\t\n");HAL_Delay(500);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

**吐槽一下,显示“%”只能用下面的方法

printf("%%");
printf("%c",'%');

3.串口接收与发送

1)进行基本配置

除了上述配置外,加入中断

2)编辑代码

触发中断时系统会调用定义于stm32f1xx_it.c的void USART1_IRQHandler(void)

可以看到该中断服务函数又调用 HAL_UART_IRQHandler(&huart1),该函数定义于stm32f1xx_hal_uart.c中:

在传输模式下,该函数调用 UART_Receive_IT(huart);该函数同样定义于stm32f1xx_hal_uart.c中,该函数调用可重定义函数 HAL_UART_RxCpltCallback(huart);并重定向printf及sprintf

#include<stdio.h>
int fputc(int ch,FILE *f){HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);return ch;
}
int fgetc(FILE  *f){uint8_t ch;HAL_UART_Receive(&huart1,(uint8_t*)&ch,1,0xffff);return ch;
}
#define RX_BUFFER_SIZE 50
uint8_t rxBuffer[RX_BUFFER_SIZE];//发送缓冲区
uint8_t rxData; //单字节接收数据
uint8_t txBuffer[RX_BUFFER_SIZE+10];//发送还出去
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1) // 检查是否为 USART1{static uint16_t rxIndex = 0;// 保存接收到的字节到缓冲区if (rxIndex < RX_BUFFER_SIZE - 1)  //确保不会写入超过缓冲区边界的位置{rxBuffer[rxIndex++] = rxData;// 如果接收到换行符(表示消息结束)if (rxData == '\n'){rxBuffer[rxIndex] = '\0'; // 添加字符串结束符// 拼接前缀并发送数据sprintf((char *)txBuffer, "STM32 Received: %s", rxBuffer);printf("%s", txBuffer);rxIndex = 0; // 重置接收缓冲区索引}}// 继续接收下一个字节HAL_UART_Receive_IT(&huart1, &rxData, 1);}
}
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &rxData, 1);  //开启接收中断   参数为串口句柄、数据存储地址、接收字节数/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE *///uint8_t msg[]="Hello World!\t\n";printf("Hello World!\t\n");while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

 

3)分析

 HAL_UART_Receive_IT()很有趣?!不要忘了加!两处!

相关文章:

STM32F103RCT6学习之三:串口

1.串口基础 2.串口发送 1&#xff09;基本配置 注意&#xff1a;实现串口通信功能需在keil中设置打开Use Micro LIB&#xff0c;才能通过串口助手观察到串口信息 2)编辑代码 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration-------------…...

js 计算税率错误——如何处理

处理方法 var 税额Number(price_notax)*Number(tax_rate)/100;税额税额.toFixed(2);var 含税单价Number(price_notax)Number(税额);var 非小计Number(price_notax)*Number(common_num);var 含税小计Number(含税单价)*Number(common_num);含税小计含税小计.toFixed(2); 税额税额…...

12. 日常算法

1. 主持人调度&#xff08;一&#xff09; 题目来源 class Solution { public:bool hostschedule(vector<vector<int>>& schedule) {// write code heresort(schedule.begin(), schedule.end());int start -1, end 0;for (auto & nums : schedule){end…...

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…...

咖啡即将“从天而降”,无人机外卖时代来袭

如今&#xff0c;在我国的一些城市&#xff0c;无人机配送咖啡已经从设想变为现实&#xff0c;开启了商业化的初步尝试。 当咖啡遇上无人机&#xff0c;奇妙场景开启 想象一下这样的画面&#xff1a;你在户外的露营地&#xff0c;慵懒地躺在帐篷里&#xff0c;或是在城市公园…...

kettle经验篇:Pentaho Repository 类型资源库卡顿问题

2024年马上就结束了&#xff0c;终于在结束前解决了困扰许久的一个问题&#xff1a;kettle的Pentaho Repository 资源库异常卡顿。所以在此也梳理、记录下2024年的最后一个大问题。 项目场景 工作中一个重要内容是数据中心项目&#xff0c;也就必不可少的要用到ETL技术&#x…...

python opencv的sift特征检测(Scale-Invariant Feature Transform)

sift 官方文档地址&#xff1a;https://docs.opencv.org/4.10.0/da/df5/tutorial_py_sift_intro.html 创建SIFT实例cv2.SIFT.create()特征检测sift.detect描述子sift.compute/sift.detectAndCompute画特征cv2.drawKeypoints 原图 特征点 代码 import cv2first ./12.pngsif…...

若依定时任务

表结构 目录 quartz框架 SysJobServiceImpl实现类 使用切点,在构造器执行的时候执行定时任务的构建(这个类是交给IOC容器的,所以这个时间点就是项目启动的时候)SysJobServiceImpl实现类的init方法创建任务 /*** 创建定时任务*/public static void createScheduleJob(Scheduler …...

k8s-node2 NotReady 节点NotReady如何解决?

从集群中移除 k8s-node2 [rootk8s-master ~]# kubectl delete node k8s-node2 node "k8s-node2" deleted重置 k8s-node2 登录到 k8s-node2 上&#xff0c;使用以下命令重置该节点&#xff0c;使其退出集群并恢复到初始状态&#xff1a; [rootk8s-node2 ~]# sudo k…...

Ubuntu通过mDNS实现局域网local域名和octoprint域名访问

OctoPrint是一个开源的3D打印机控制软件&#xff0c;它提供了一个Web界面&#xff0c;允许用户远程监控和管理3D打印机。通过USB连接到打印机后&#xff0c;用户可以使用任何带有Web浏览器的设备来控制打印作业&#xff0c;包括开始、停止、暂停打印&#xff0c;以及在打印过程…...

短视频矩阵账号管理技术源码搭建详解,支持OEM

一、引言 在短视频矩阵系统中&#xff0c;账号管理是至关重要的一环&#xff0c;它涉及到多平台账号的接入、用户信息的安全存储与高效管理、权限的精准控制以及账号数据的同步与更新等关键功能。一个健壮、灵活且安全的账号管理技术架构&#xff0c;能够为整个短视频矩阵系统的…...

【源码 导入教程 文档 讲解】基于springboot校园新闻管理系统源码和论文

可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C、python、数据可视化、大数据、文案 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xf…...

Spark SQL DML语句

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 Spark本地模式安装_spark3.2.2本地模式安装-CSDN博客 DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09;操作主要用来对…...

开发微信小程序的过程与心得

起因 作为家长&#xff0c;我近期参与了学校的护学岗工作。在这个过程中&#xff0c;我发现需要使用水印相机来记录护学活动&#xff0c;但市面上大多数水印相机应用都要求开通会员才能使用完整功能。作为一名程序员&#xff0c;我决定利用自己的技术背景&#xff0c;开发一个…...

【1224】数据结构(sizeof/数组的长度定义/读取字符串函数/线性表长度/左值右值/静态变量/指针与引用)

1.对一维整型数组a的正确说明是 #define SIZE 10 (换行) int a[SIZE];说法是否正确&#xff1f; 正确 数组的SIZE可以用宏定义&#xff0c;但不能用变量 2.如有定义&#xff1a;char str[20];&#xff0c;能将从键盘输入的字符串“How are you”保存到 str 数组的语句是&#x…...

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局&#xff0c;当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem&#xff0c;跳转到最后一个tab页面时&#xff0c;会发现tab不滚动&#xff0c;手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…...

基于pytorch的深度学习基础3——模型创建与nn.Module

三 模型创建与nn.Module 3.1 nn.Module 模型构建两要素&#xff1a; 构建子模块——__init()__拼接子模块——forward&#xff08;&#xff09; 一个module可以有多个module&#xff1b; 一个module相当于一个运算&#xff0c;都必须实现forward函数&#xff1b; 每一个mod…...

Debian-linux运维-docker安装和配置

腾讯云搭建docker官方文档&#xff1a;https://cloud.tencent.com/document/product/213/46000 阿里云安装Docker官方文档&#xff1a;https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker-on-a-linux-ecs-instance 天翼云常见docker源配置指导&#xff1a;htt…...

Docker完整技术汇总

Docker 背景引入 在实际开发过程中有三个环境&#xff0c;分别是&#xff1a;开发环境、测试环境以及生产环境&#xff0c;假设开发环境中开发人员用的是jdk8&#xff0c;而在测试环境中测试人员用的时jdk7&#xff0c;这就导致程序员开发完系统后将其打成jar包发给测试人员后…...

在JavaScript文件中定义方法和数据(不是在对象里定以数据和方法,不要搞错了)

在对象里定以数据和方法看这一篇 对象字面量内定义属性和方法&#xff08;什么使用const等关键字&#xff0c;什么时候用键值对&#xff09;-CSDN博客https://blog.csdn.net/m0_62961212/article/details/144788665 下是在JavaScript文件中定义方法和数据的基本方式&#xff…...

3大维度解析Awesome Claude Skills:重新定义AI效率边界

3大维度解析Awesome Claude Skills&#xff1a;重新定义AI效率边界 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/awesom…...

【紧急通知】Python 3.14 JIT默认profile已触发AWS Lambda冷启动恶化阈值!立即执行这4项低成本开关校准

第一章&#xff1a;Python 3.14 JIT编译器冷启动恶化现象的紧急定性Python 3.14 引入的实验性 JIT 编译器&#xff08;基于 pyjion 改进的 cpython-jit 后端&#xff09;在首次执行高密度计算函数时&#xff0c;观测到显著的冷启动延迟激增——部分基准测试中延迟较 Python 3.1…...

BepInEx Linux环境实战指南:从部署到故障解决

BepInEx Linux环境实战指南&#xff1a;从部署到故障解决 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 引言&#xff1a;Linux玩家的Mod困境 作为Linux平台的Unity游戏玩家&…...

SPI总线抽象架构设计与实现

## 1. SPI总线抽象架构设计### 1.1 设计目标与架构分层 SPI总线抽象设计主要解决三个核心问题&#xff1a; 1. 总线与设备解耦&#xff1a;通过分层设计实现硬件无关性 2. 快速切换硬件/模拟SPI&#xff1a;统一接口规范支持多种实现方式 3. 跨平台移植性&#xff1a;核心逻辑与…...

避开RK3568 MPP开发的那些坑:V4L2缓冲区管理与实时码流稳定性优化实战

RK3568 MPP开发实战&#xff1a;V4L2缓冲区管理与码流稳定性优化指南 在嵌入式视频处理领域&#xff0c;RK3568凭借其强大的多媒体处理能力成为中高端项目的首选方案。但当我们真正将其应用于工业视觉、安防监控等对稳定性要求严苛的场景时&#xff0c;开发者常常会遇到令人头疼…...

手把手教你用SecureCRT录制和修改VBS脚本(解决无限循环执行问题)

SecureCRT自动化实战&#xff1a;从脚本录制到循环执行VBS的完整指南 在IT运维和网络设备管理的日常工作中&#xff0c;重复性命令的执行往往占据了大量时间。SecureCRT作为一款功能强大的终端仿真软件&#xff0c;其脚本录制和VBS脚本执行功能能够显著提升工作效率。本文将深入…...

Docker vs Pip:MinerU本地部署全攻略,哪种方式更适合你的PDF解析需求?

Docker与Pip部署MinerU深度对比&#xff1a;如何为PDF解析选择最佳方案 在文档自动化处理领域&#xff0c;PDF解析工具的选择往往直接影响工作效率。MinerU作为一款开源的PDF解析工具&#xff0c;因其对复杂排版的良好支持而受到开发者青睐。但面对Pip和Docker两种主流部署方式…...

AgiBot World数据集实战:如何用百万级轨迹训练你的机器人策略(附避坑指南)

AgiBot World数据集实战&#xff1a;百万级轨迹训练机器人策略的完整指南 1. 数据集的革命性价值 在机器人学习领域&#xff0c;数据质量与规模直接决定了策略模型的性能上限。AgiBot World作为当前最大的开源机器人操作数据集&#xff0c;其核心突破在于&#xff1a; 规模突…...

Qt图形项事件处理全解析:从mousePressEvent到mouseReleaseEvent的正确姿势

1. Qt图形项鼠标事件处理的核心机制 在Qt框架中处理图形项的鼠标交互&#xff0c;本质上是在和事件传播机制打交道。我刚接触Qt图形视图框架时&#xff0c;也曾被mouseMoveEvent不触发的问题困扰过整整两天。后来才发现&#xff0c;这其实是一套设计精巧的事件处理哲学——只有…...

掌握NeuralForecast:构建企业级时间序列预测解决方案

掌握NeuralForecast&#xff1a;构建企业级时间序列预测解决方案 【免费下载链接】neuralforecast Nixtla/neuralforecast - 一个Python库&#xff0c;提供统一的接口来训练和预测时间序列数据&#xff0c;使用神经网络方法&#xff0c;如N-BEATS和N-HITS&#xff0c;以及传统的…...