STM32使用printf丢失第一个字母的问题
STM32使用printf函数给串口打印信息的执行步骤为:
1.重定向printf函数
给uart.c文件中增加如下函数:
//重定向c库函数printf到USART1
int fputc(int ch, FILE *f)
{
/* 清SR寄存器中的TC标志 */
USART_ClearFlag(USART1,USART_FLAG_TC); /* 发送一个字节数据到USART1 */
USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毕 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return (ch);
}
2.增加头文件stdio
#include <stdio.h>
3.勾选Use MircoLIB
以上3条,缺一不可,如果你只做了第一步,编译的时候,就会报错,如下所示:
CFG\uart.c(52): error: #20: identifier "FILE" is undefined
如果只做了前两步,而没有勾选Use MicorLIB,编译器虽然不会报错,但是串口不会输出数据。
很多人做了重定向函数以后,输出一串字符的第一个字符会丢失,根本原因是因为SR寄存器中的TC标志默认是置1的。
解决方法1:和我上面的重定向函数一样,在开始先用USART_ClearFlag(USART1,USART_FLAG_TC);函数把TC标志清0。
解决方法2:写字符串的时候,前面留一个空格。
两种方法选一个即可。
给出一个使用printf函数在STM32串口1输出数据的完成工程源代码:
点击下载:【例程2.6】printf函数(MDK5工程)
转自:http://www.rationmcu.com/stm32/1517.html
STM32使用printf丢失第一个字母的问题的更多相关文章
- 关于STM32中printf函数的重定向问题
printf函数一般是打印到终端的,stm32芯片调试中经常需要用到串口来打印调试信息,那能不能用串口实现类似windows的Console中的printf呢? 答案是肯定的,那就是printf函数的 ...
- STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...
- MDK中STM32使用Printf函数详细解析【转载】
在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,用Keil仿真是,串口不能正确的输出,软件仿真时,总是卡在那 里.有点纳闷,然后调用USART_SendData()函 ...
- STM32中printf重定向到串口
学习STM32过程中,经常打交道的莫过于串口,你可以将任何信息,当然重要的是调试信息打印到串口中输出,总是用一个字节发送函数或者字符串发送函数 总是有些不放便,之前编程中熟悉的莫过于printf了,下 ...
- 如果简化stm32中printf函数的使用——首先重定向
STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...
- STM32—重定向printf和getchar函数到串口
在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输. 以printf()为例: printf()函数实际上是一个 ...
- STM32 的 printf() 函数串口重定向(HAL库标准库都适用)
1.建立工程 2.核心:添加新文件usar_fputc.c (名字随便自己命名),把文件添加到项目中去 #include "stdio.h" #include "stm3 ...
- stm32串口输出丢失第一个字符的问题及原因
因为TC和TXE 标志位在复位的时候会被置1,导致第一次没有发送. 所以在初始化串口的时候可以增加一句 USARTx->SR=0;(如 USART1->SR=0;)
- STM32串口发送第一个字符丢失解决之道
stm32用printf函数重定向到串口USART1发现第一个字符没打印出来具体如下: 刚开始修改fputc函数如下: int fputc(int ch,FILE *f){USART_SendData ...
随机推荐
- IFE 2015_spring task0002 自学记录
JavaScript数据类型及语言基础 1. 判断arr是不是一个数组,返回一个bool值. 首先javascript有5大基本数据类型:Undefined,Null,Boolean,Number和S ...
- pxcook-高效易用的自动标注工具, 生成前端代码
1.pxcook.sketch(http://www.fancynode.com.cn/pxcook)
- 通过IndexOf获得DataRow在DataTable中的行号
Row = dt.Rows.IndexOf(dr);
- 【第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-L】用来作弊的药水
链接:https://www.nowcoder.com/acm/contest/90/L来源:牛客网 输入x,a,y,b,(1<=x,a,y,b<=10^9)判断x^a是否等于y^b 前面 ...
- LeetCode OJ:Insertion Sort List (插入排序链表)
Sort a linked list using insertion sort. 用插入排序来排序一个list,额, 我写的好麻烦啊, debug了好久,至少提交了5次...写吐了快,先贴代码,写的也 ...
- php判断字符串长度 strlen()与mb_strlen()函数
PHP strlen() 函数 定义和用法 strlen() 函数返回字符串的长度. 语法 strlen(string) 参数:string <?php $str=‘中文a字1符‘; echo ...
- So sad! ,Asphyre Closure
So sad ! Asphyre Closure! 不过我相信开发App用Delphi应该是快的. 越与平台无关,优势越明显. 积累的组件市场. 虽然objc 有很多开源支持. 但总感觉还不够delp ...
- MySQL auto_increment介绍 以及 查询和修改auto_increment的方法
一.auto_increment使用方法 .创建table时设置auto_increment属性和初始值100 create table nonove ( id bigint unsigned not ...
- GO语言打包ICO图标
1. go get github.com/akavel/rsrc2. 创建manifest文件, 命名:main.exe.manifest : <?xml version="1.0&q ...
- 记一次愚蠢的gradle操作
今晚把工作移植到mac平台,在用gradle命令 exec ./gradlew --parallel --info assembleDebug 打包apk时卡住,gradle一直处于下载状态,过了几分 ...