OpenEdv-开源电子网

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

使用串口通信但是每次都丢失第一位数据或者第一位数据出错

[复制链接]

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-3-3
在线时间
15 小时
发表于 2016-5-5 11:36:20 | 显示全部楼层 |阅读模式
1金钱
#include "includes.h"
int fputc(int ch,FILE *f)//重定义printf函数
{
                USART_SendData(USART1,(uint8_t) ch);
                while (USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);        //判断标志位检测是否发送完毕
                return (ch);
}
int fgetc(FILE *f)//重定义scanf函数
{
                while (USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET);
                return (USART_ReceiveData(USART1));
}
void uart1_init()
        {
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//开启uart1和GPIOA的时钟
                /*GPIO配置*/
                GPIO_InitTypeDef        gpio_pin9_init;
                gpio_pin9_init.GPIO_Mode=GPIO_Mode_AF_PP;//tx初始化为推挽复用模式
                gpio_pin9_init.GPIO_Pin=GPIO_Pin_9;
                gpio_pin9_init.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA,&gpio_pin9_init);
                GPIO_InitTypeDef        gpio_pin10_init;
                gpio_pin10_init.GPIO_Mode=GPIO_Mode_IN_FLOATING;//rx初始化为浮空输入模式
                gpio_pin10_init.GPIO_Pin=GPIO_Pin_10;
                gpio_pin10_init.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA,&gpio_pin10_init);
                /*串口的配置*/
                USART_InitTypeDef usart_init;//初始化串口
                usart_init.USART_BaudRate=9600;
                usart_init.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
                usart_init.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//全双工需要发送接收都开启
                usart_init.USART_Parity=USART_Parity_No;
                usart_init.USART_StopBits=USART_StopBits_1;
                usart_init.USART_WordLength=USART_WordLength_8b;
                USART_Init(USART1,&usart_init);
                USART_Cmd(USART1,ENABLE);
        }
int main()
        {
                uart1_init();
                unsigned int n;
                while(1)
                        {
                                scanf("%d",&n);
                                printf("%d",n);
                        }
        }

第一位数据出错

第一位数据出错

丢失第一位数据

丢失第一位数据

最佳答案

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

int fputc(int ch,FILE *f)//重定义printf函数 { USART_SendData(USART1,(uint8_t) ch); while (USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); //判断标志位检测是否发送完毕 return (ch); } 调换这两句位置
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2016-5-5 11:36:21 | 显示全部楼层
int fputc(int ch,FILE *f)//重定义printf函数
{
                 USART_SendData(USART1,(uint8_t) ch);
                 while (USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);        //判断标志位检测是否发送完毕
                return (ch);
}

调换这两句位置
学无止境
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11548
金钱
11548
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-5-5 11:41:26 | 显示全部楼层

初始化的问题。
想办法保证TXE、TXC这些标志都正确复原。

回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-3-3
在线时间
15 小时
 楼主| 发表于 2016-5-5 12:43:16 | 显示全部楼层
jermy_z 发表于 2016-5-5 11:36
int fputc(int ch,FILE *f)//重定义printf函数
{
                 USART_SendData(USART1,(uint8_t) ch) ...

还是不行啊,还是第一位数据出错,但是没有丢失的现象了
2016-05-05_124156.png
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2016-5-5 14:30:36 | 显示全部楼层
电路问题,第一个字节电平起不来吧,或者是电路有延时被滤掉了
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-3-3
在线时间
15 小时
 楼主| 发表于 2016-5-5 14:56:51 | 显示全部楼层
xsx127 发表于 2016-5-5 14:30
电路问题,第一个字节电平起不来吧,或者是电路有延时被滤掉了

可是为什么我改成这样后,就可以了呢?
int main()
        {
                uart1_init();
                char p;
                while(1)
                        {
                                scanf("%c",&p);
                                printf("%c",p);
                        }
        }

主函数里把数据类型改为char就可以了,这是怎么回事呢?
还请指导,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 17:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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