STM32
直播中

李春梅

7年用户 1801经验值
私信 关注
[问答]

串口在初始化的时候,PC端会接收到一个字节的乱码是为什么?

串口在初始化的时候,PC端会接收到一个字节的乱码是为什么?

回帖(1)

陈琳

2021-12-15 10:19:06
单片机:stm32f103vet6
平台:野火STM32开发板
问题描述:串口在初始化(还未发送任何数据)的时候,PC端会接收到一个字节的乱码
状态:未解决
我调试串口的步骤一般是先初始化UART,然后printf重定向,最后在串口助手里面打印出一些数字。调试还算顺利,成功打印出一行数据。但是每次复位的时候,第一个字符之前都有会多出一个乱码,起初以为是TC置1的问题,改了好几遍都没有效果,后来想一想,TC置1的问题是发送的第一个字符丢失,现在的问题是,第一个字符不丢失,而是第一个字符前出现一个乱码。
串口助手设置十六进制显示,发现在最开始的时候会打印一个字符0xFE。
单步调试发现在串口初始化前的GPIO初始化USART1的TXD——PA9的时候,出现0x00,全速运行时发送0xFE,后来想到,会不会是GPIO在复位的时候出现一个低电平脉冲被PC识别成一个字符。但是发现GPIO在复位后默认是模拟输入状态,ODR寄存器复位后为0,于是用GPIO_SetBits函数将PA9先拉高,再初始化PA9为GPIO_Mode_AF_PP,问题仍然存在。
问题仍然存在,待解决。
附代码:
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"
#include


void LED_portConfig(void)
{
GPIO_InitTypeDef temp;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
temp.GPIO_Mode = GPIO_Mode_Out_PP;
temp.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
temp.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&temp);
}


void uart_init(unsigned long baud)
{
USART_InitTypeDef temp;
GPIO_InitTypeDef gpio_initStruct;
/*gpio config*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);


GPIO_SetBits(GPIOA,GPIO_Pin_9); //À­¸ßPA9
gpio_initStruct.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_initStruct.GPIO_Pin = GPIO_Pin_9;
gpio_initStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio_initStruct); //ÂÒÂë·¢ËÍλÖÃ
gpio_initStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio_initStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA,&gpio_initStruct);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_StructInit(&temp);
temp.USART_BaudRate = baud;
USART_Init(USART1,&temp);
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_ClearFlag(USART1,USART_FLAG_TXE);
USART_Cmd(USART1,ENABLE);
}


int fputc(int ch, FILE *f)
{
USART_SendData(USART1,(unsigned char) ch);
while((USART1->SR & USART_FLAG_TC) == 0);
return ch;
}


void uart_sendstring(char *str)
{
while(*str)
{
USART_SendData(USART1,*str++);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
}
}


void delay(unsigned long t)
{
unsigned long i,j;
for(i=0; i
for(j=0; j<1000; j++);
}


int main(void)
{
unsigned int k=0x12345678;
LED_portConfig();
uart_init(115200); //出现乱码的位置
printf("Hello worldnr");
printf("k = 0x%04xnr",k);
while(1)
{
printf("k = 0x%04xr",k++);
GPIO_SetBits(GPIOC,GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
delay(500);
GPIO_ResetBits(GPIOC,GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
delay(500);
}
}
举报

更多回帖

×
20
完善资料,
赚取积分