OpenEdv-开源电子网

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

printf第一个字符丢失

[复制链接]

37

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2011-7-25
在线时间
31 小时
发表于 2011-8-1 23:30:02 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-2 01:46:39 | 显示全部楼层
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
USART1->DR = (u8) ch;      
return ch;
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

37

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2011-7-25
在线时间
31 小时
 楼主| 发表于 2011-8-2 07:58:53 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
加了这个函数发送了函数里面的字符后,后面跟着的数据只有一字节,不知道怎么了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-2 08:57:11 | 显示全部楼层
用我贴的这个,替换原来usart.c里面的这个函数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

37

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2011-7-25
在线时间
31 小时
 楼主| 发表于 2011-8-2 09:18:00 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
#include <stm32f10x_lib.h>
#include "stdio.h"
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 

int handle; 
/* Whatever you require here. If the only file you are using is */ 
/* standard output using printf() for debugging, no file handling */ 
/* is required. */ 
}; 
/* FILE is typedef’ d in stdio.h. */ 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 

x = x; 

//重定义fputc函数 
int fputc(int ch, FILE *f) 
{       
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕    
USART1->DR = (u8) ch;       
return ch; 
}
#endif
还是不行;一样的结果
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-2 12:20:24 | 显示全部楼层
那就怪了.
你下载最新例程,试试里面的串口实验.看是否OK?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-8-8 20:25:51 | 显示全部楼层
//重定义fputc函数  
int fputc(int ch, FILE *f) 
{       
  
USART1->DR = (u8) ch;   
 while((USART1->SR&0X40)==0);//循环发送,直到发送完毕  //这个不是应该在下面么????
return ch; 
}
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2012-12-18 17:25:42 | 显示全部楼层
我做实验也是一直第一个字符丢失。刚开始我还自认为是ST芯片问题呢,现在才发现是代码问题哟。
回复 支持 反对

使用道具 举报

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
发表于 2015-4-30 11:45:21 | 显示全部楼层

这是因为TC和TXE 标志位在复位的时候会被置1,导致第一次没有发送。 
可以在printf("why?i=%d",i);前添加一句USART1->SR;清下标志位。
或者简单点,在你需要输出的字符前加一个空格。
——来自百度

http://www.360doc.com/content/14/1013/12/17350204_416529797.shtml

把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2015-4-30
在线时间
1 小时
发表于 2015-4-30 12:11:21 | 显示全部楼层
int fputc(int ch, FILE *f)//
{

USART_SendData(USART1, (uint8_t) ch);


while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完毕

return (ch);
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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