查看: 34114|回复: 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 | 显示全部楼层
    太掉了,好贴
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    动手用blinker做台灯
    动手用blinker做台灯
    分享一个使用blinker做的台灯,使用的是esp8266,可以使用天猫精灵进行控制(亮度、开
    户外穿戴定位手表制作
    户外穿戴定位手表制作
    户外穿戴定位手表制作 五一刚过;最近还是
    Arduino烧入失败显示avrdude: stk500_getsync() attempt 1 of 10: not in sy...
    Arduino烧入失败显示avrdu
    我的arduino烧录的时候烧录失败显示下面这些东西
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    开贴讲讲NRF24L01P,让你彻底搞懂它的工作原理,持续更...
    开贴讲讲NRF24L01P,让你
    *****************************************
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表