查看: 36070|回复: 20

在Arduino上使用printf格式化输出到串口

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2014-12-13 16:24 | 显示全部楼层 |阅读模式
    不少朋友尝试在Arduino上使用printf格式化输出,但没有效果。在PC上printf默认输出到屏幕,但arduino不是PC,也没有屏幕,所以不能直接使用。
    这里提供一个使用printf输出到串口的方法:

    首先在程序中加入这两个函数:

    kittenblock中小学创客名师推荐的图形化编程软件

    
    int serial_putc( char c, struct __file * )
    {
      Serial.write( c );
      return c;
    }
    void printf_begin(void)
    {
      fdevopen( &serial_putc, 0 );
    }
    



    接着在setup中完成串口输出的初始化:

    kittenblock中小学创客名师推荐的图形化编程软件

    void setup() {
      Serial.begin(115200);
      printf_begin();
    
      //其他代码
    }


    现在你可以尝试下使用printf输出了:

    kittenblock中小学创客名师推荐的图形化编程软件

    int cs=12345;
    float cf=12.345;
    char c[15]="Hello,world!";
    
      printf("***arduino.cn***\n\r");
      printf("111:%d\n",cs);
      printf("222:%lf\n",cf);
      printf("333:%s\n",c);
      printf("111:%d\n222:%lf\n333:%s\n",cs,cf,c);



    以上程序float输出不了,我目前也不知道原因,如果有人知道了,请回复告之我。



    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2016-5-21 16:09 | 显示全部楼层
    avr-libc官方手册上说的,若要使printf类函数支持浮点,需要在编译时加上编译参数:
    -Wl,-u,vfprintf -lprintf_flt -lm

    该用户从未签到

    发表于 2016-4-15 16:11 | 显示全部楼层
    为啥我运行老提示C:\DOCUME~1\HJ\LOCALS~1\Temp\build7258304247366153583.tmp/core.a(HardwareSerial.cpp.o):(.rodata._ZTV14HardwareSerial[vtable for HardwareSerial]+0x6): undefined reference to `Print::write(unsigned char const*, unsigned int)'collect2.exe: error: ld returned 1 exit status
  • TA的每日心情
    开心
    2015-4-20 15:34
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-1-20 10:12 | 显示全部楼层
    printf, sprintf 确实不支持float,原因就是没有实现这个功能

    点评

    您意思是C本身不支持?  详情 回复 发表于 2015-1-20 11:19
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2015-1-20 11:19 | 显示全部楼层
    leyap 发表于 2015-1-20 10:12
    printf, sprintf 确实不支持float,原因就是没有实现这个功能

    您意思是C本身不支持?
    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2015-4-2 11:18 | 显示全部楼层
    不行啊
    sketch_apr02a.ino: In function 'void printf_begin()':
    sketch_apr02a.ino:14:29: error: 'fdevopen' was not declared in this scope
    编译有误。

    ]
  • TA的每日心情
    开心
    2015-5-9 10:01
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    发表于 2015-4-2 13:33 | 显示全部楼层
    用sprintf 输出的字符只有一个“ ? ”,后来在某个帖子上看到,使用 dtostrf 可以正常输出。以下是我在lcd5110驱动中添加的一个输出float的函数:

    kittenblock中小学创客名师推荐的图形化编程软件

    void showfloat(float data,int y) {
          char b[20];
          dtostrf(data,4,2,b);
          lcd_write_english_string(0,y,"               ");
          lcd_write_english_string(0,y,b);
    }
  • TA的每日心情
    开心
    2015-4-20 15:34
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-4-20 15:25 | 显示全部楼层
    奈何col 发表于 2015-1-20 11:19
    您意思是C本身不支持?

    对,avr-gcc编译器没有实现这个功能

    点评

    哦哦  详情 回复 发表于 2015-5-6 17:24
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2015-5-6 17:24 | 显示全部楼层
    leyap 发表于 2015-4-20 15:25
    对,avr-gcc编译器没有实现这个功能

    哦哦
    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2015-10-16 21:46 | 显示全部楼层
    太掉了,好贴
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    Arduino lcd屏幕亮了但是不显示字符
    Arduino lcd屏幕亮了但是
    Arduino的lcd屏亮了但是上面没有字符显示,串进去的滑动变阻器也旋过了,但是还是没有
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    【Arduino】108种传感器模块系列实验(98)---L298N电机驱动板
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    两个ESP8266通过云端实现远程数据交互
    两个ESP8266通过云端实现
    原理简述:利用发布订阅模式。一个ESP8266作为消息发布者,另一个ESP8266作为消息订阅
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表