我使用的是IAR+F103+CUBE在写程序
最近想搞一下USB CDC虚拟串口,我想把虚拟串口的输出,重定义到printf上
首先参考了printf重定义到uart的方法,把uart发送函数改为虚拟串口发送函数
结果发送不出来东西,而使用虚拟串口发送函数直接发送的东西却能发送到电脑上
有没有搞过相关开发的大侠们,求各位指点
- #ifdef __GNUC__
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
- set to 'Yes') calls __io_putchar() */
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
- #else
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
- #endif /* __GNUC__ */
复制代码
- PUTCHAR_PROTOTYPE
- {
- /* Place your implementation of fputc here */
- /* e.g. write a character to the USART1 and Loop until the end of transmission */
- CDC_Transmit_FS( (uint8_t*)ch, 1);
- return ch;
- }
复制代码
|
return ch;不应该这样吗
{
CDC_Transmit_FS((uint8_t *)&ch,1);
return ch;
}
我使用重定向函数是这个,但是只只能发储区printf字符串的第一个符号,后面的都发不出去
{
while(CDC_Transmit_FS((uint8_t*)(&ch),1)!=USBD_OK){}
return ch;
}
这样就可以发送了,但是需要关闭串口助手,再开启串口助手,不知道为什么,望大神指点下
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
void (*log_out)(uint8_t *,uint32_t len)=USART2_send;
static char printBuf[256] = {0U};
int t_log(const char *fmt_s, ...)
{
va_list aptr;
int ret;
va_start(aptr,fmt_s);
ret = vsprintf(printBuf, fmt_s, aptr);
va_end(aptr);
if(log_out!=T_NULL)log_out((uint8_t*)printBuf,strlen(printBuf));
return(ret);
}
printf已经out了,
你这个效率很低