我在程序里应用printf("aa")来想串口发送字符串,可编译通过在仿真的时候老是进不到main()里,老是死在一个地方
https://bbs.eeworld.com.cn/upfiles/img/20083/2008327152050715.jpg
我把printf("aa")这就话去掉仿真就正常了,这是怎么回事啊!已经#include <stdio.h>
你要根据说明修改相应的函数
ST有一个应用笔记中谈到过这个问题,我忘记是哪一个了,你先自己找一找吧。
因为printf()涉及到硬件的操作,硬件环境不同当然底层驱动也
__io_putchar(int ch)函数就是最最底层的驱动。
跟编译器有关
我也遇到这个问题了,不过我在原来的项目里已经解决这个问题了,但是在前天的建的新项目有出现这个问题了,也忘了怎么解决的。只是把所有的都屏蔽掉了。。
最早的时候用keil编译器时,我是重新写了一个简单的支持有限的printf()来解决这个问题。。楼主如果觉得够用,也可以考虑,不要把太多的精力浪费到这里。。
我曾经成功解决了这个问题,我把答案发在qq群里面了
我曾经成功解决了这个问题,我把答案发在qq群里面了。现在忘了怎么解决。以后还是把东西发到论坛上。好找啊。
我记得应该是printf()函数需要其他的函数支持,你少了一个支持printf()函数,所以出现了这种问题。
难道是RV编译器环境下需要retarget.c文件
不知道你用的是什么编译器呢?
我把自己一直再用的函数库贴一下,希望对楼主有帮助
这个是我自己写的UART_INTERFACE.H头文件
/***************************************************************************************
*说明:用于STM32F10XXX串口UART1通讯,可以将printf scanf等重定向到串口
*环境:KEIL FOR ARM MDK3.11
*硬件:对应PA9-UART1TX PA10-UART1RX,使用USART1
*版本:V0.1
*作者:alien2006
*备注:对应的PA9/PA10以及USART1已由UART_Init函数自身初始化,无需在程序中完成
***************************************************************************************/
#ifndef __UART_INTERFACE_H
#define __UART_INTEFFACE_H
#include "stm32f10x_lib.h"
#include "stdio.h"
/*私有变量----------------------------------------------------------------------------*/
/*函数声明----------------------------------------------------------------------------*/
void UART_Init(unsigned long UART_baud); //波特率,如115200
int fputc(int ch, FILE *f); //fputc重定向
int fgetc(FILE *f); //fgetc重定向
#endif
下面是.C的部分内容,省去了初始化的部分,自己看着写好了
/*******************************************************************************
* Function Name : int fputc(int ch, FILE *f)
* Description : Retargets the C library printf function to the USART.printf重定向
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int fputc(int ch, FILE *f)
{
/* Write a character to the USART */
USART_SendData(USART1, (u8) ch);
/* Loop until the end of transmission */
while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET))
{
}
return ch;
}
/*******************************************************************************
* Function Name : int fgetc(FILE *f)
* Description : Retargets the C library printf function to the USART.fgetc重定向
* Input : None
* Output : None
* Return : 读取到的字符
*******************************************************************************/
int fgetc(FILE *f)
{
/* Loop until received a char */
while(!(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET))
{
}
/* Read a character from the USART and RETURN */
return (USART_ReceiveData(USART1));
}
如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB“
我一般都是自己写printf函数,然后用标准sprintf来格式化,可以完全实现标准printf
我一般都是自己写printf函数,然后用标准sprintf来格式化,可以完全实现标准printf
这样直接sprintf写到缓冲区,然后发送 似乎比直接用printf还要给力点阿 感觉这样不错啊