你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于printf重定向到usbCDC(VCP)的问题

[复制链接]
Genglilai 提问时间:2015-12-29 17:27 /
我使用的是IAR+F103+CUBE在写程序
最近想搞一下USB CDC虚拟串口,我想把虚拟串口的输出,重定义到printf上
首先参考了printf重定义到uart的方法,把uart发送函数改为虚拟串口发送函数
结果发送不出来东西,而使用虚拟串口发送函数直接发送的东西却能发送到电脑上
有没有搞过相关开发的大侠们,求各位指点

  1. #ifdef __GNUC__
  2. /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  3. set to 'Yes') calls __io_putchar() */
  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  5. #else
  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  7. #endif /* __GNUC__ */
复制代码

  1. PUTCHAR_PROTOTYPE
  2. {
  3.   /* Place your implementation of fputc here */
  4.   /* e.g. write a character to the USART1 and Loop until the end of transmission */
  5.   CDC_Transmit_FS( (uint8_t*)ch, 1);
  6.   return ch;
  7. }
复制代码


收藏 2 评论10 发布时间:2015-12-29 17:27

举报

10个回答
watershade 回答时间:2015-12-29 20:16:25
楼主的做法没问题,如果你用的板子是别人的建议看一下原理图。另外你可以用uart单纯的发送数据做个实验。然后在重定向。
埃斯提爱慕 回答时间:2015-12-30 20:04:40
提示: 作者被禁止或删除 内容自动屏蔽
秋水之下 回答时间:2016-12-16 19:08:48
CDC_Transmit_FS((uint8_t*)&ch, 1);
  return ch;不应该这样吗
斜阳 回答时间:2016-12-17 09:17:53
帮顶                     
jayyf1 回答时间:2017-11-22 18:13:12
楼主,USB CDC重定向问题解决了吗?我也是printf发不出数据,CDC_Transnit_FS没问题
血亦友 回答时间:2017-12-13 09:23:07
int fputc(int ch,FILE *F)
{
        CDC_Transmit_FS((uint8_t *)&ch,1);
        return ch;
}
我使用重定向函数是这个,但是只只能发储区printf字符串的第一个符号,后面的都发不出去
g921002 回答时间:2017-12-13 18:50:46
建議用sprinf做比較彈性。
  1. uint8_t usbtxbuf[1024];
  2. #define usbMsg(...) sprintf((char*)usbtxbuf, __VA_ARGS__);CDC_Transmit_FS(usbtxbuf,strlen((char*)usbtxbuf))
复制代码
暂不知道 回答时间:2018-2-4 21:52:49
int fputc(int ch, FILE *f)
{
  
  while(CDC_Transmit_FS((uint8_t*)(&ch),1)!=USBD_OK){}
  return ch;
}
这样就可以发送了,但是需要关闭串口助手,再开启串口助手,不知道为什么,望大神指点下
Kevin_G 回答时间:2019-8-8 16:23:11
感谢感谢
tanic 回答时间:2019-8-8 17:00:20
#include <stdint.h>       
#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了,
你这个效率很低

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版