STM32与串口屏交互(USART HMI)

STM32与串口屏交互(USART HMI)


前言

最近大创和嵌入式比赛都使用到了串口屏,刚开始学习也没什么头绪,后来瞎搞搞就能用了,但是我设计的非常简单,还有很多需要优化的地方,后面我会将代码发出来。为什么我要用串口屏呢?串口屏综合了以上屏幕的特点,即尺寸大、管脚少,能够充分减少占用单片机的I/O资源,且支持触摸。串口屏可作为输出设备(显示)以及输入设备(按键),开发难度小,操作简单,软件要求低且拥有专门的上位机辅助开发,重点是:看着牛


一、前期准备

界面设计就不多做叙述,我直接写关于stm32与串口屏交互的部分

二.关于在上位机USART HMI里面的一些配置

1.首先是在program.s里面定义一个全局变量的标志位
在这里插入图片描述

2.我这边使用的是双态按钮,只有0和1两个值,通过按下后的值向单片机发送一个值,这里是使用了prints函数直接通过串口来发送的
在这里插入图片描述到这里串口屏上位机代码的部分就写完了,我写的很简单,也没个帧头帧尾的,大家可以加上。

三.stm32的代码部分

关于单片机的代码部分,我是用的是stm32f407zgt6的最小系统板,这里必须注意下,最小系统板和核心板要 避免使用串口1,因为下载程序的时候会占用(PA9 PA10)这两个引脚,所以这个问题困扰了我很久,后来突然想到这件事情,我换成串口2就正常了**

下面是代码展示

#include "tjc.h"
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

///*
//* 描述: HAL库实现多串口使用printf输出
//* 参数: huart:对应的串口结构体
//* 返回: 无*/
void Uart_printf(UART_HandleTypeDef *huart,char *format, ...)
{
   
   
  char buf[512]; //定义临时数组,根据实际发送大小微调

  va_list args;
  va_start(args, format);
  uint16_t len = vsnprintf((char *)buf, sizeof
### 实现32位系统串口(HMI)交互 对于32位系统的USART通信,特别是当涉及到HMI设备时,通常会采用特定的数据传输协议来确保数据的可靠性和准确性。开发板提供了多个串口通信接口[^1],这使得可以选择最适合连接到HMI的那个端口。 在STM32CubeIDE环境中配置USART用于DMA模式下的发送和接收操作能够显著提高效率并减少CPU占用率[^2]。为了简化初始设置,在初次尝试仅需关注发送功能的情况下,可以只连接TX线而忽略RX线[^3];然而,实际应用中双向通信更为常见,因此建议最终实现完整的收发机制。 下面是一个简单的例子展示如何利用USART进行基本的信息交换: ```c #include "stm32f1xx_hal.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); char message[] = "Hello, Serial Display!"; while (1) { /* 发送消息给串口 */ HAL_UART_Transmit(&huart1, (uint8_t*)message, strlen(message), HAL_MAX_DELAY); // 延迟一段时间再重复发送 HAL_Delay(1000); } } // 初始化USART1 static void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; // 设置波特率为115200bps huart1.Init.WordLength = UART_WORDLENGTH_8B;// 字符长度设为8位 huart1.Init.StopBits = UART_STOPBITS_1; // 停止位数设为1 huart1.Init.Parity = UART_PARITY_NONE; // 不使用奇偶校验 huart1.Init.Mode = UART_MODE_TX_RX; // 启用发送和接收模式 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 关闭硬件流控制 huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK){ Error_Handler(); // 如果初始化失败则调用错误处理程序 } } ``` 此代码片段展示了通过USART串口发送字符串的过程。需要注意的是,这里假设已经完成了必要的外设初始化工作,并且选择了合适的参数如波特率等以匹配目标HMI的要求。 #### 数据帧结构设计 针对更复杂的应用场景,可能还需要定义专门的数据包格式来进行命令传递或状态查询等功能。例如,每条指令前加上起始标志(Start of Text),结尾处附带结束标记(End of Text)。这样做的好处是可以更容易地区分不同的信息单元以及检测潜在的数据损坏情况。 #### 中断和服务例程优化 尽管上述实例主要集中在轮询方式上,但在某些情况下启用中断服务例程(ISR)可能是更好的选择。它允许处理器在完成其他任务的同时响应来自外部设备的通知事件,从而提高了整体性能表现[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值