OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2351|回复: 7

STM32F103ZET6精英版USART1读取乱码

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-1-1
在线时间
6 小时
发表于 2020-1-9 23:05:58 | 显示全部楼层 |阅读模式
1金钱
今天学习了USART发送、接收数据及使用中断。一开始尝试发送数据,电脑端接收正常,但在尝试接收数据却出现乱码。为找到原因,我写了一段USART1发送从电脑端接收到的数据,并控制LED的代码,我尝试从电脑端发送0x00、0x01,但接收到的数据什么都有,每次上电都不一样,比如:6C 74 D4 74 3C 74 ……
代码如下,请各位大神帮忙分析分析!

void RCC_Config(void);
void UART_Config(void);
void NVIC_Config(void);
void GPIO_Config(void);
void delay(void);
void Exchange_LED0(void);

int main()
{
    RCC_Config();
    GPIO_Config();
    UART_Config();
    NVIC_Config();
    GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
    while(1)
    {
        delay();
    }
}

void RCC_Config()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
}

void GPIO_Config()
{
    GPIO_InitTypeDef GPIO_InitStructure;
   
    //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  //USART1_RX      GPIOA.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //LED0                GPIOB.5
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    //LED1                GPIOE.5
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}

void UART_Config()
{
    USART_DeInit(USART1);
   
    USART_InitTypeDef USART_InitStructure;
    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(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);
}

void NVIC_Config()
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   
    NVIC_Init(&NVIC_InitStructure);
   
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}

void delay(void)
{
    int i = 0x1FFFFF;
    while(i--);
}

void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        uint16_t data = USART_ReceiveData(USART1);
        switch(data)
        {
            case 0x00:
                GPIO_WriteBit(GPIOE, GPIO_Pin_5, Bit_SET);
              break;
            case 0x01:
                GPIO_WriteBit(GPIOE, GPIO_Pin_5, Bit_RESET);
              break;
        }
        
    Exchange_LED0();
        
        USART_SendData(USART1, data);
    }
}

void Exchange_LED0()
{
    uint8_t status = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5);
    if(status == Bit_SET)
        status = Bit_RESET;
    else
        status = Bit_SET;
    GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)status);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14407
金钱
14407
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-1-10 11:40:47 | 显示全部楼层
建议你不要在中断里边做过多操作 试下在中断函数 搞个标志位  然后主函数通过判断标志位 去控制灯  ,还有如果还是乱码换原子的 串口中断逻辑去试下
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-1-6
在线时间
5 小时
发表于 2020-1-10 14:51:57 | 显示全部楼层
感觉没什么不妥,你看看波特率,还有是不是以hex格式发送
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-1-1
在线时间
6 小时
 楼主| 发表于 2020-1-10 19:37:21 | 显示全部楼层
忧伤还是快乐 发表于 2020-1-10 14:51
感觉没什么不妥,你看看波特率,还有是不是以hex格式发送

波特率没有问题,都是9600,其余设置我也都一一核对过,MCU向PC发送数据正常。
在PC上,我是以HEX格式发送、接收的,帖子上面的数字都是十六进制的。
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-1-10 19:54:25 | 显示全部楼层
系统时钟确认有没有问题
一分耕耘一分收获。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-1-1
在线时间
6 小时
 楼主| 发表于 2020-1-10 19:58:39 | 显示全部楼层
翼行园子 发表于 2020-1-10 11:40
建议你不要在中断里边做过多操作 试下在中断函数 搞个标志位  然后主函数通过判断标志位 去控制灯  ,还有 ...

我试了,只在中断中设置标志位和接收的数据,在主函数中判断和控制LED,仍然不行。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-1-1
在线时间
6 小时
 楼主| 发表于 2020-1-10 21:46:17 | 显示全部楼层
yklstudent 发表于 2020-1-10 19:54
系统时钟确认有没有问题

重新设置了系统时钟,应该没有问题了,可问题依旧,接收异常,发送正常,郁闷。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-1-1
在线时间
6 小时
 楼主| 发表于 2020-2-22 11:54:31 | 显示全部楼层
后来我换了个串口助手的软件,问题就解决了。难道是Windows系统的问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 23:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表