[STM32F10x] 使用printf函数进行串口调试问题

  硬件:STM32F103C8T6

  平台:Keil ARM-MDk V5.11

  利用printf函数通过串口(USART)进行调试时遇到的一个问题:

  

    printf("Hello, Mini-M3");

  本意是想输出"Hello, Mini-M3",但是通过串口调试助手,得到的输出是"ello, Mini-M3",也就是第一个数据没有接收到,而且这种情况只会在初始化USART后第一次

  发送数据时出现。

  USART发送数据的代码如下:

  

int fputc(int c, FILE *stream)
{
    USART_SendData(UARTx, (U8)c);

    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(UARTx, USART_FLAG_TC) == RESET);

    return c;
}

  

  解决办法:

  在初始USART时,将SR寄存器中的TC标志位清零,即增加下面一条代码:

 USART_ClearFlag(UARTx, USART_FLAG_TC);

  具体原因不详。

  

时间: 2024-10-21 06:45:47

[STM32F10x] 使用printf函数进行串口调试问题的相关文章

使用printf函数实现串口信息打印——设置IAR和Keil的Options

在Keil和IAR中都可以使用printf函数,但两者设置的方法不一样.以下分别是IAR和Keil的设置. 下面是Keil的设置. 选中Options--->Target--->Code Generation--->Use MicroLIB.

STM32F051关于printf函数在串口打印中的使用

1.需要在Options for Target -> Code Generation 中勾选Use MicroLIB: 2.需要加入下面这个函数: int fputc(int ch, FILE *f) { USART_SendData(USART1,(uint8_t)ch); while (USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET); return (ch); } 3.需要加入如下一个头文件: #include "stdio.h&qu

STM32 的 printf() 函数串口重定向(HAL库标准库都适用)

1.建立工程 2.核心:添加新文件usar_fputc.c (名字随便自己命名),把文件添加到项目中去 #include "stdio.h" #include "stm32f1xx_hal.h" extern UART_HandleTypeDef huart1; uint8_t ch; uint8_t ch_r; //重写这个函数,重定向printf函数到串口 /*fputc*/ int fputc(int c, FILE * f) { ch=c; HAL_UART

重定向C库中stdio文件中的printf()函数,文件流-->串口USART1

6.4 一些说明 数据属性可以重写同名的方法属性.这是为了避免在大型系统中产生问题的意外名称冲突.所以用一些减少冲突的常用方法是很有效果的.常用的方法包括:大写字母方法名称,用唯一的字符串来做为数据属性的名称(可以是个下划线_)或者用动词命名方法和用名字命名数据属性. 数据属性就像和对象的普通用户一样可以被方法引用.换句话说,类不能用来实现纯净的数据类型.事实上,在python中不能强制数据隐藏,一切基于约定.(另一方面,如C中写的,python的实现可以做到完全隐藏实现细节并且在必要是可以控制

关于<printf重定向到串口导致程序无法运行>的问题

摘自:http://www.openedv.com/posts/list/3172.htm usart这部分代码我也是从网上copy出来的,一下是作者的解释:简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNU

keil中的串口调试:

keil中串口的虚拟调试信息在通过View-serial windows-#usart1/2/3/4/debug(printf)可以看到.当然也可以通过虚拟串口VSPD+串口调试助手在外部实现,方法如下: 虚拟 串口使用:步骤 1 下载虚拟串口软件,虚拟2个连接的串口COMA/COMB,这两个串口与PC机的真实物理串口没关系.两边的设置相同 2 打开串口通讯助手,将A分配给串口通讯助手,则B就分配给下面的COMx 2 在MDK中输入命令行或者将下面的做成debug.ini文件加载 MODE CO

单片机工程加入printf函数

之前学习用的是Alientek MiniSTM32开发板,使用的开发环境可以通过特殊的配置集成printf函数,调试程序的时候不大喜欢用仿真器,最近项目开始使用单片机,只能够用UART1_Send(uint8_t * const tx_buf,uint16_t tx_num),真心有点不习惯没有printf函数的日子,程序调试的话最方便莫过于printf函数,于是开始研究如何在单片机中加入printf函数. 跟串口驱动相关的函数put_char(uint8_t data),需要根据不同的嵌入式平

【转】用宏定义代替printf函数

问题提出 有时候我们想用宏定义来决定是编译debug版本的代码还是release的代码,dubug版本的代码会通过printf打印调试信息,release版本的代码则不会.我们总不能对每一条printf都这样写: 1 #if _DEBUG_ 2 printf("hello world!"); 3 #endif 这样子实在是太麻烦了!万一要各个地方都要打印,会使版面看起来很乱. 解决方法 我后来想到一个方法,可以使用宏定义代替printf函数,由于printf是可变参数的函数,这里就要用

2440裸机串口调试 while(!(rUTRSTAT0 & 0x2));问题

前两天写RTC中断 使用串口输出 发现程序会出现while(!(rUTRSTAT0 & 0x2));出不来的情况,但是中断是正常运作的 解决方法: main函数增加: U32 mpll_val = 0,consoleNum; Port_Init(); //定义在2440lib.c mpll_val = (92<<12)|(1<<4)|(1); //init FCLK=400M, ChangeMPllValue((mpll_val>>12)&0xff, (