1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在大家使用keiliarstm32等开发芯片的时候,想来不合法的就是使用打印通过串口输出数据,拆解电池其他作用。的,那么在 GCC 中我们能像在 KEIL 中一样重映射打印的输出流到串口上吗?答案是肯定的。 KEIL中的重映射方式及原理 /* * libc_printf.c * * 创建于:2015 年 12 月 26 日 * 作者:杨 * * 使用标准C库时,重映射printf等输出函数的文件 * 添加在工程内动态功能(选择性选择半主机) */ #include //包括“stm32f10x.h” #pragma 导入(__use_no_semihosting) //标准库需要的支持函数 结构体_文件 { int 句柄; }; 文件 __stdout; //定义_sys_exit()最新使用半主机模式 _sys_exit(int x) { x = x; } //重映射fputc函数,此函数为多个输出函数的基础函数 int fputc(int ch, FILE *f) { 而 (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, (uint8_t) ch); 返回 ch; } 在keil中的C库中,printf、scanf等输入输出流函数是通过fputc、fgetc来实现操作的,所以我们只需要在我们的工程中重定义这两个函数的功能就可以实现printf、scanf等流函数的重映射。GNU下的C流函数重映射方式我们来看看前几中提供的样例工程中的usart_stdio例程中的代码截图: #include #include #include /* * 要实现您需要创建的 STDIO 功能 * _read 和 _write 函数并将它们挂接到 * 您正在使用的 USART。这个例子也有一个缓冲 * 用于基本行编辑的读取功能。 */ int _write(int fd, char *ptr, int len); int _read(int fd, char *ptr, int len); void get_buffered_line(void); /* * 这是一个非常经典的字符环形缓冲区 */ #define BUFLEN 127 静态 uint16_t start_ndx; 静态 uint16_t end_ndx; 静态字符缓冲区[BUFLEN + 1]; #define buf_len ((end_ndx - start_ndx) % BUFLEN) 静态内联 int inc_ndx(int n) { return ((n + 1) % BUFLEN); } 静态内联 int dec_ndx(int n) { return (((n + BUFLEN) - 1) % BUFLEN); } /* 将光标后退一格 */ 静态内联 void back_up(void) { end_ndx = dec_ndx(end_ndx); usart_send_blocking(USART1, ' |