STM32实战项目-串口打印

news2024/11/17 17:39:10

前言:

本小结主要实现串口打印功能,主要将上一结的状态机运行次数,通过串口在串口终端上打印出来,硬件电路上主要是TTL转USB驱动电路,软件上主要有状态机函数,串口发送函数等调试工具是串口助手。


目录

1.硬件电路

2.串口讲解 

 2.1定义

2.2协议

 3.软件编程

3.1参数配置 

 3.2程序结构

3.2.1程序框架

 3.2.2打印配置

3.2.3串口发送配置 

 4.效果展示



1.硬件电路

主要集成TTL转USB驱动,插入MicroUSB线即可使用。

2.串口讲解 

 2.1定义

UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收

在单片机产品设计中,UART主要用于设备与设备之间的通讯,设备与传感器之间的通信。例如通过RS-485接口,构成工业设备系统总线。

2.2协议

 UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

其中各位的意义如下:

起始位:先发出一个逻辑"0"的信号,表示传输字符的开始。

数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符,从最低位开始传送。

奇偶校验位:数据位加上这一位后,使得"1"的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。(一般这个位可以不设置,减少位数,提高传输数据量

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。(一般设置为1位高电平

空闲位:处于逻辑"1"状态,表示当前线路上没有资料传送。

波特率:衡量数据传送速率的指标。表示每秒钟传送的比特位。(不同使用场景设置不同波特率,对数据要求准确,较少传输速率

图示如下:

 3.软件编程

3.1参数配置 

 串口打印函数需要配置串口参数,我们需要配置cubemax相关参数,主要是串口的引脚,波特率,有效数据个数,停止位,采样次数,奇偶校验位,主要配置如下:

 3.2程序结构

3.2.1程序框架

 

 整体框架没有发生变化,配置完串口之后,会自动生成串口源文件。且源文件中会自动生成我们配置好参数的代码:

void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

}

 3.2.2打印配置

我们要实现串口显示状态机运行次数,首先我们需要在run函数部分增加打印函数,这样才可以通过串口发送到终端显示,代码如下:

 

static void Run()
{
	static uint16_t STA_Cnt = 1;
	
		
	if(STA_Machine.ucSTA_Machine_Status == STA1)
	{
		printf("״̬»úµÚ%d´ÎÔËÐÐ!\r\n",STA_Cnt++);
	}
	
	//ÔËÐÐ״̬»ú
	switch(STA_Machine.ucSTA_Machine_Status)
	{
		case STA1: STA_Machine.Fun_STA1();	printf("״̬»ú״̬ΪSTA1\r\n");     break;
		case STA2: STA_Machine.Fun_STA2();	printf("״̬»ú״̬ΪSTA2\r\n");     break;
		case STA3: STA_Machine.Fun_STA3();	printf("״̬»ú״̬ΪSTA3\r\n");     break;
		case STA4: STA_Machine.Fun_STA4();	printf("״̬»ú״̬ΪSTA4\r\n");     break;
		case STA5: STA_Machine.Fun_STA5();	printf("״̬»ú״̬ΪSTA5\r\n\r\n"); break;
		default: STA_Machine.ucSTA_Machine_Status = STA1; 
	}
}

为了方便清晰观察,我们可以在初始化部分,将版本号,测试说明放进去,具体代码如下:

static void Peripheral_Set(void); 

/* Public variables-----------------------------------------------------------*/
MyInit_t MyInit = 
{
	Peripheral_Set
};

/* Private function prototypes------------------------------------------------*/      


/*
	* @name   Peripheral_Set
	* @brief  ÍâÉèÉèÖÃ
	* @param  None
	* @retval None      
*/
static void Peripheral_Set()
{
	printf("----´Ë³ÌÐòʵÏÖ´®¿Ú´òÓ¡¹¦ÄÜ----\r\n");
	printf("Initialization completed, system startup!\r\n");
	printf("Software version is V%.1f\r\n\r\n",SoftWare_Version);
	
	printf("¿ªÊ¼ÔËÐÐÓÐÏÞ״̬»ú:\r\n\r\n");
}

3.2.3串口发送配置 

我们想使用串口发送函数,就要明白这个函数如何使用,以及传参的设置,该函数具体如下:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

huart为串口号,pData是发送数据地址 需要注意的是 类型是八位的,Timeout是发送时限,超出这个时间,就是超时,需要重传。我们可以利用fput函数进行发送,具体代码如下:

int fputc(int ch,FILE* f)
{
	//查询方式循环发送
	HAL_UART_Transmit(&huart_debug, (uint8_t *)&ch, 1, 0x000A);

	return ch;
}

 4.效果展示

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习学习记录1:假设空间

我们可以把学习过程看作一个在所有假设组成的空间中进行搜索的过程,搜索目标是找到与训练集"匹配" 的假设,即能够将训练集中的瓜判断正确的假设.假设的表示一旦确定,假设空间及其规模大小就确定了.对于西瓜问题,这里我们…

[MySQL索引]2.索引的底层原理(一)

索引的底层原理(一)B-树索引B树索引tips: ​ 通过使用malloc/new来申请4字节的内存,但是操作系统不是说每一次用户申请4字节内存,我就只分配4字节,这样申请次数多了就要涉及频繁的用户态和内核态的切换,开销…

AM5728(AM5708)开发实战之安装Debian 10桌面操作系统

一 环境搭建 准备一个SD卡启动卡,能够正常引导板卡启动,后续会把Debian 10镜像安装到SD卡ext4分区 准备两个U盘,一个格式化成fat32文件系统,另一个格式化成ext4文件系统 下载Debian 10镜像,镜像名字为debian-10.4.0-a…

【前端】一个更底层库React,附教程

Reat是什么?React在UI里最火的也是最好的库,React是一个做UI的库,具体来说是做UI组件的库,专注于做mvc中的v,它是一个更底层的工具库。为你应用的每一个状态设计简洁的视图,当数据变动时 React 能高效更新并…

Linux发行版本与发行版的简单的介绍

Linux linux下有很多发行的版本,或者称之为魔改版本。以下介绍一些常见的版本,以避免名词的混淆。 linux是提供了一个内核,就像是谷歌的内核一样,QQ浏览器就是使用的谷歌的内核,也算是一个发行版本。 Ubuntu&#x…

课程项目简介

一、深度学习模型入门 1&#xff0c;什么是机器学习&#xff1f; Study of algorithms that improve their performance P at some task T with experience E. 研究在某个任务T上用经验E提高其性能P的算法。 well-defined learning task:<P,T,E> 明确的学习任务&#…

手把手开发一门程序语言JimLang (2)

根据爱因斯坦的相对论&#xff0c;物体的质量越大&#xff0c;时间过得越快&#xff0c;所以托更对于我的煎熬&#xff0c;远远比你们想象的还要痛苦…今天给大家来盘硬菜&#xff0c;也是前些时日预告过的JimLang的开发过程… Let’s go !!! 语法及解析 JimLang.g4 这里我们…

轮毂要怎么选?选大还是选小?

随着改装车的越来越火爆&#xff0c;汽车轮毂可选择的款式也越来越多&#xff0c;90%的人换轮毂&#xff0c;首先选的就是外观。大轮毂的款式多&#xff0c;外形大气好看&#xff0c;运动感十足&#xff0c; 那是不是选大轮毂就可以呢&#xff1f;不是的&#xff0c;汽车轮毂要…

全面吃透Java Stream流操作,让代码更加的优雅

文章目录1 认识Stream流1.1 什么是流1.2 流与集合1.2.1 流只能遍历一次1.2.2 外部迭代和内部迭代1.3 流操作1.3.1 中间操作1.3.2 终端操作1.3.3 使用流2 学会使用Stream流2.1 筛选和切片2.1.1 用谓词筛选2.1.2 筛选各异的元素2.1.3 截短流2.1.4 跳过元素2.2 映射2.2.1 map方法2…

Java经典面试题——对比 Vector、ArrayList、LinkedList 有何区别?

典型回答 这三者都是实现集合框架中的 List &#xff0c;也就是所谓的有序集合&#xff0c;因此具体功能也比较近似&#xff0c;比如都提供按照位置进行定位、添加或者删除的操作&#xff0c;都提供迭代器以遍历其内容等。但因为具体的设计区别&#xff0c;在行为、性能、线程…

详解CRC原理以及C语言实现

CRC检验原理 CRC&#xff08;Cyclic Redundancy Check&#xff09;校验是一种常用的数据校验方法&#xff0c;它通过计算数据的校验码来检测数据在传输过程中是否出现了错误。 CRC校验的基本原理是将数据按照一定的规则进行计算&#xff0c;得到一个固定长度的校验码&#xf…

JavaScript内改变this指向

之前我们说的都是代码内 this 的默认指向 今天我们要来说一下如何能改变 this 指向 也就是说, 你指向哪我不管, 我让你指向哪, 你就得指向哪 开局 在函数的原型( Function.prototype ) 上有三个方法 call apply bind 既然是在函数的原型上, 那么只要是函数就可以调用这三个方…

React(七):Router基本使用、嵌套路由、编程式导航、路由传参、懒加载

React&#xff08;七&#xff09;一、React-Router的基本使用1.安装和介绍2.路由的配置和跳转3.Navigate的使用4.如果找不到对应的路由路径&#xff1f;二、嵌套路由的用法三、编程式路由导航1.类组件中使用useNavigate2.函数式组件中使用useNavigate四、路由跳转传参1.设置好路…

小白学Pytorch 系列--Torch API(1)

小白学Pytorch 系列–Torch API Torch version 1.13 Tensors TORCH.IS_TENSOR 如果obj是PyTorch张量&#xff0c;则返回True。 注意&#xff0c;这个函数只是简单地执行isinstance(obj, Tensor)。使用isinstance 更适合用mypy进行类型检查&#xff0c;而且更显式-所以建议使…

【计组】主存储器有关知识梳理

一、主存储器 主存储器可以直接和CPU进行通信&#xff0c;但是只能保存临时数据&#xff0c;在断电后数据就消失。还有一个特点是&#xff0c;主存储器的容量小&#xff0c;速度快&#xff0c;造价高。 1.构成 2.主存中存储体的构造 最小的存储单位是存储元&#xff0c;存储元…

近亿美元:人工心脏龙头永仁心医疗完成超大额A轮融资

近日&#xff0c;永仁心医疗器械有限公司&#xff08;以下简称“永仁心医疗”&#xff09;完成近一亿美元A轮融资&#xff0c;由北京科兴中维生物技术有限公司&#xff08;SINOVAC科兴&#xff09;领投&#xff0c;太平&#xff08;深圳&#xff09;医疗健康产业私募股权投资基…

腾讯IM h5版本,在安卓原生和IOS原生支持情况的调查以及踩坑、解决办法

介绍 公司准备基于腾讯IM进行开发即时通讯功能&#xff0c;想用H5来开发&#xff0c;这样方便以后移植&#xff0c;在原生app里直接加载&#xff0c;通过三天时间的调查&#xff0c;以及与腾讯客服&#xff0c;技术来回沟通&#xff0c;已经有一定的成果&#xff0c;现将调查成…

【Redis】Redis持久化(一)

目录 1.Redis持久化 1.1.RDB持久化 1.1.1.执行时机 1.1.2.RDB原理 1.1.3.小结 1.2.AOF持久化 1.2.1.AOF原理 1.2.2.AOF配置 1.2.3.AOF文件重写 1.3.RDB与AOF对比 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Red…

SpringBoot - 什么是跨域?如何解决跨域?

什么是跨域&#xff1f; 在浏览器上当前访问的网站&#xff0c;向另一个网站发送请求&#xff0c;用于获取数据的过程就是跨域请求。 跨域&#xff0c;是浏览器的同源策略决定的&#xff0c;是一个重要的浏览器安全策略&#xff0c;用于限制一个 origin 的文档或者它加载的脚本…

Doris集成其他系统——ODBC外部表

Doris集成其他系统——ODBC外部表 文章目录Doris集成其他系统——ODBC外部表0. 写在前面1. 正文1.1 ODBC外部表介绍1.2 使用方式2. 使用 ODBC 的 MySQL 外表2.1 前置芝士2.2 安装 unixODBC2.3 安装MySQL 对应版本的 ODBC2.3.1 安装方式2.3.2 检查安装结果2.3.3 其他节点的安装及…