STM32L4串口发送数据与串口助手上显示数据不符问题解决

现象: 使用STM32L412往串口助手上发送数据,串口助手上显示的数据并不是实际发送的数据
原因:

  1. 波特率设置不正确:在使用串口通信时,发送端和接收端的波特率必须一致,如果设置不一致会导致数据发送和接收出现错误;
  2. 数据位、停止位、奇偶校验位设置不正确:在使用串口通信时,发送端和接收端的数据位、停止位、奇偶校验位也必须一致,如果设置不一致会导致数据发送和接收出现错误;
  3. 上位机解析数据错误:在上位机处理接收到的数据时,可能存在解析错误的情况,需要仔细检查解析代码是否正确;
  4. 数据发送缓存区满:当发送数据的速度超过串口发送缓存区的处理能力时,会导致数据丢失或者错误。

最终解决: 代码是基于寄存器编写的,经过debug查看寄存器的值发现,是由于波特率计算错误即:LPUART1 -> BRR的值错误导致的。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用STM32串口模块来发送和接收数据,并通过调试助手等工具来查看接收到的数据。下面是一个简单的示例代码,演示了如何使用STM32串口发送数据并接收并显示接收到的数据: ```c #include "stm32f4xx.h" void USART2_Init(void) { // 启用USART2和GPIOA的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 配置USART2的引脚 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStruct); // 将引脚连接到USART2的功能 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // 配置USART2 USART_InitStruct.USART_BaudRate = 9600; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStruct); // 启用USART2 USART_Cmd(USART2, ENABLE); } void USART2_SendChar(char ch) { // 等待发送缓冲区为空 while (!(USART2->SR & USART_SR_TXE)) ; // 发送数据 USART2->DR = (ch & 0xFF); } char USART2_ReceiveChar(void) { // 等待接收缓冲区非空 while (!(USART2->SR & USART_SR_RXNE)) ; // 读取接收到的数据 return (USART2->DR & 0xFF); } int main(void) { USART2_Init(); while (1) { // 发送数据 USART2_SendChar('H'); USART2_SendChar('e'); USART2_SendChar('l'); USART2_SendChar('l'); USART2_SendChar('o'); USART2_SendChar('\n'); // 接收数据显示 char receivedChar = USART2_ReceiveChar(); // 将接收到的数据显示串口助手等工具上 USART2_SendChar(receivedChar); } } ``` 这是一个基本的示例,它在循环中发送字符串"Hello"并接收并显示接收到的字符。你可以根据需要修改代码以适应你的应用场景。记得根据你的硬件配置修改引脚和串口号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值