STM32 LCD屏显示串口接收数据

本文探讨了在STM32上使用LCD显示串口接收数据的优化方法,对比传统的for循环和LCD_ShowNum函数,介绍了LCD_ShowString函数的应用,该方法能更直观地显示数据,但对数据判断能力有限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32
最近在学习PID调节,想通过电脑把串口调试助手发给32的数据通过LCD显示出来
以前显示串口接收的数据都是用 for语句和LCD_ShowNum();语句 把数组USART_RX_BUF里的数据一个个打出来
这样不是很直观,且有些繁琐
今天突然想到是不是可以用LCD_ShowString();
他的入口参数是这样的void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 p); 最后一个参数是想要显示字符串的首地址
这样我们只要把想要显示的数据的首地址给他就好了,后面就会自动显示了,
LCD_ShowString(70,30,300,16,16,&USART_RX_BUF[2]);*
这样就能把接收到的数据从第三个开始显示出来了,实测可以;
但也有缺点,就是不能对每个数进行判断
(以上代码来自正点原子)

### 如何使用STM32标准库函数通过LCD显示串口接收的数据 为了实现这一功能,主要分为几个部分的工作:初始化硬件资源(UART和LCD),编写数据处理逻辑以及循环读取并展示接收到的信息。 #### 初始化硬件资源 对于STM32微控制器而言,在利用其标准外设库开发程序之前,需先完成必要的配置工作。这通常涉及到设置系统时钟、使能相应的GPIO端口及时钟源等操作[^1]。 ```c // 配置USART接口参数 void USART_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能相关模块的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 设置PA2作为USART2_TX, PA3作为USART2_RX GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART参数 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); // 启动USART USART_Cmd(USART2, ENABLE); } ``` 同样地,针对LCD幕也需要类似的初始化过程,具体取决于所使用的显示型号及其驱动芯片。这里假设采用的是基于ST7735R控制器的小尺寸TFT液晶显示器为例: ```c // ST7735R LCD初始化代码片段 void LCD_Init(void) { /* ...省略其他无关细节... */ LCD_WriteReg(ST7735_SWRESET); // 软件复位命令 Delay_ms(120); // 延迟一段时间等待复位结束 LCD_WriteReg(ST7735_SLPOUT); // 出睡眠模式指令 Delay_ms(120); /* 继续执行更多初始化序列直至完全准备好 */ } ``` #### 编写数据处理逻辑 当上述准备工作完成后,则可以着手构建用于解析来自UART通信端口中断事件的应用层业务逻辑了。每当有新的字符到达时触发中断服务例程(ISR),并将这些新到来的数据存储到缓冲区中以便后续分析或直接转发给LCD进行可视化呈现。 ```c uint8_t rx_buffer[BUF_SIZE]; // 定义一个环形缓存数组用来保存接收到的数据 volatile uint16_t head=0,tail=0; // 记录当前队列头尾指针位置变量声明为易失型防止编译器优化错误 // UART接收中断回调函数定义 void USART2_IRQHandler(void) { if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){ // 判断是否发生接收中断 char ch = USART_ReceiveData(USART2); // 获取最新一帧数据 // 将接收到的新字节加入到缓冲区内 rx_buffer[head++] = ch; if(head >= BUF_SIZE) head %= BUF_SIZE; // 实现环绕效果 // 如果遇到回车符则表示一行输入完毕可立即刷新至幕上 if(ch == '\n'){ DisplayLineOnLCD(rx_buffer+(tail%BUF_SIZE), head-tail); tail=head; // 更新起始索引指向下一个待处理项 } USART_ClearITPendingBit(USART2, USART_IT_RXNE); // 清除标志位避免重复响应同一事件 } } // 显示单行文本的方法示意 void DisplayLineOnLCD(char *str,uint16_t length){ int i; for(i=0;i<length;++i){ LCD_DisplayChar(str[i]); // 这里简化调用了底层API负责实际绘图动作 } } ``` 以上就是关于如何借助于STM32的标准库来达成从串行端口获取外部信息并通过图形界面即时反馈出来的基本思路和技术要点概述。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值