面这段代码,在实现串口发送一个字节的函数后,可以在勾不勾选”微库“的情况下都可以正常使用printf函数。__MICROLIB是勾选微库后会被定义的宏,因而可以通过条件编译的方式兼容。
对应文件要包含<stdio.h>头文件,否则会提示FILE无定义。
#if !defined(__MICROLIB)
#pragma import(__use_no_semihosting)
void _sys_exit(int x) //避免使用半主机模式
{
x = x;
}
struct __FILE
{
int handle;
};
FILE __stdout;
#endif
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
/* 实现串口发送一个字节数据的函数 */
serial_write(&serial1, (uint8_t)ch); //发送一个自己的数据到串口
return ch;
}
ARMGCC版本(GCC)#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
/* 实现串口发送一个字节数据的函数 */
serial_write(&serial1, (uint8_t)ch); //发送一个自己的数据到串口
return ch;
}
int _write(int file, char *ptr, int len)
{
int DataIdx;
for(DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
重写printf/* 用于实现自己的printf函数的原型 */
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
void serial2_printf( const char * format, ... )
{
char buffer[256];
va_list args;
va_start (args, format);
vsprintf (buffer,format, args);
//send_via_USART1 (buffer);
uint8_t len = strlen((const char*)buffer);
for(uint8_t i = 0; i < len; ++i)
{
/* 通过串口发送一个字节的数据 */
serial_write(&serial2, (uint8_t)buffer[i]);
}
va_end (args);
}
GCC下printf打印浮点数# printf float
USE_FLOAT_PTINT = -u_printf_float
# libraries
LIBS = -lc -lm -lnosys
LIBDIR =
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections $(USE_FLOAT_PTINT)
来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。