OpenEdv-开源电子网

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

关于USART1接收数据,然后输出乱码的问题

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-11-4
在线时间
4 小时
发表于 2021-9-6 18:49:52 | 显示全部楼层 |阅读模式
2金钱
如题,请教各位前辈,在main.c加上while(1){}死循环之后,XCOM的输出数据为正常,一旦去掉while死循环,就会产生输出乱码的问题,请教一下这里面涉及的原理问题。原程序如下:

//////////////////////////////////////////////////////////////////////////////////主函数main.c:
#include "stm32f10x.h"
#include "usart_IRQ.h"

int main(void)
{       
        usart_IRQ();
        while(1){}   //这个死循环去掉,数据输出就会乱码
}

///////////////////////////////////////////////////////////////////////////////IO口、串口、中断初始化函数:
#include "stm32f10x.h"
#include "stm32f10x_it.h"

void NVIC_STR(){
NVIC_InitTypeDef NVIC_STRCTURE;
NVIC_STRCTURE.NVIC_IRQChannel=USART1_IRQn;
NVIC_STRCTURE.NVIC_IRQChannelPreemptionPriority=2;
NVIC_STRCTURE.NVIC_IRQChannelSubPriority=2;
NVIC_STRCTURE.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_STRCTURE);
}

void usart_IRQ(){
       
GPIO_InitTypeDef GPIO_STR;
USART_InitTypeDef USART_STR;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
       
GPIO_STR.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_STR.GPIO_Pin=GPIO_Pin_9;
GPIO_STR.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_STR);

GPIO_STR.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_STR.GPIO_Pin=GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_STR);

USART_STR.USART_BaudRate=115200;
USART_STR.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_STR.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
USART_STR.USART_Parity=USART_Parity_No;
USART_STR.USART_StopBits=USART_StopBits_1;
USART_STR.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_STR);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_STR();

USART_Cmd(USART1,ENABLE);

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
}

/////////////////////////////////////////////////////////////////////////////////////////中断服务函数
void USART1_IRQHandler(){
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=RESET)
{uint8_t usart_value;
        USART_ClearFlag(USART1,USART_FLAG_RXNE);
        usart_value=USART_ReceiveData(USART1);
        USART_SendData(USART1,usart_value);
}
}

最佳答案

查看完整内容[请看2#楼]

如果裸机例程没有死循环,芯片会一直复位重新运行,还有你的串口发送数据,没有加等待发送完毕,这些会导致数据乱码
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2021-9-6 18:49:53 | 显示全部楼层
如果裸机例程没有死循环,芯片会一直复位重新运行,还有你的串口发送数据,没有加等待发送完毕,这些会导致数据乱码
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-9-7 10:19:50 | 显示全部楼层
那肯定啊,正常的程序都要加一个死循环防止程序跑飞
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-11-4
在线时间
4 小时
 楼主| 发表于 2021-9-7 10:47:46 | 显示全部楼层
GJJ1999 发表于 2021-9-7 10:20
如果裸机例程没有死循环,芯片会一直复位重新运行,还有你的串口发送数据,没有加等待发送完毕,这些会导致 ...

前辈,如果在我两次手动发送数据之间,芯片会一直复位运行,程序运行到中断服务函数部分,没有检测到我的数据输入,会不会停止,然后再复位?还是其他的情况?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-2 19:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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