找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6347|回复: 3
打印 上一主题 下一主题
收起左侧

关于arduino使用spintf来格式化输出

[复制链接]
跳转到指定楼层
楼主
【声明】本贴当前介绍  %d  %s %f 的使用方法
我们在练习C语言的时候使用 printf 来输出字符,使用占位符(百度百科称作 【规定符】如: %d , %f)来输出变量。
在arduino 中 Serial.print 和 Serial.println 无法像 C语言编译器中那样直接使用占位符进行输出。
但是 arduino 可以 使用 sprintf 来输出。
举例:
你想用 Arduino在串行监视器上显示多个变量,而不必使用一堆单独的Serial. print()语句,
如果是这样,那么使用 sprintf()函数。
假设您要将这行文本打印到串行监视器:
numBurritos  = 3
tempStr = 147.7
“The 3 burritos are 147.7 degrees F”
  1. Serial.print("The ");  
  2. Serial.print(numBurritos);  
  3. Serial.print(" burritos are ");  Serial.print(tempStr);  
  4. Serial.println(" degrees F");
复制代码
事实上,对于添加到输出中的每个变量,您都会在代码中添加两个串行打印。
如果你想打印一行 多个变量插入到这样的字符串中怎么办就需要长长的代码量。

而使用 sprintf 就可以简化,这一输出。我们可以根据需要将尽可能多的变量打印到我们的字符串中,所需的代码量保持在 3 行。

这里你需要的三行代码:
  1. char buffer[40];
  2. sprintf(buffer, "The %d burritos are %s degrees F", numBurritos, tempStr);
  3. Serial.println(buffer);
复制代码
让我们仔细看看每一行代码。
  char buffer[40];
字符数组需要与最终输出字符串一样大或更大。因此,计算你计划在该字符串中存储的字符数,并确保缓冲区至少有那么大。用于存储输出的字符。

  sprintf(buffer, "The %d burritos are %s degrees F", numBurritos, tempStr);


sprintf 用于将输出的字符存储到 buffer 数组中
  Serial.println(buffer);
打印
我们用一个程序来验证一下   使用 %d 使用方法


  1. void setup() {
  2.   Serial.begin(9600);
  3.   for(int i=0;i<8;i++ ){
  4.     char jinoas[100];
  5.     sprintf(jinoas,"打印 i 的值为:%d , i+1= %d,i+2= %d",i,i+1,i+2);
  6.     Serial.println(jinoas);
  7.   }
  8. }

  9. void loop() {


  10. }
复制代码




我们用一个程序来验证一下   使用 %s 使用方法


  1. char nun[] = "nufdsfsd";
  2. void setup() {
  3.   Serial.begin(9600);
  4.   char jinoas[100];
  5.   sprintf(jinoas,"num2的值为%s",nun);
  6.   Serial.println(jinoas);
  7. }

  8. void loop() {

  9. }
复制代码




使用 %f 使用方法

%f 不能直接 输出,要先转化为 字符数组 然后使用 %s 的方式进行输出,使用dtostrf()函数进行转换
我们先看转化程序

  1.    char str_temp[6];   //浮点类型转化存储缓冲数组
  2.    dtostrf(num2, 4,2, str_temp);  // 4,2 表示转化的精度
复制代码

我们用一个程序来验证一下

  1. float num2 = 321.12345;
  2. void setup() {
  3.   Serial.begin(9600);
  4.    char jinoas[100];   //打印字符缓冲数组
  5.    char str_temp[6];   //浮点类型转化存储缓冲数组
  6.    dtostrf(num2, 4,2, str_temp);  // 4,2 表示转化的精度
  7.     sprintf(jinoas,"num2的值为%s",str_temp);
  8.     Serial.println(jinoas);

  9. }

  10. void loop() {
  11. }
复制代码





以上,就是我关于 格式化输出的心得,后期有能力的话,更新其他占位符输出格式。尽量基于本贴去更新。
觉得有用,就留个言吧



评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:74069 发表于 2021-8-20 01:20 | 只看该作者
你不知道:Serial.printf 也是这功能么,连数组都省了
回复

使用道具 举报

板凳
ID:584195 发表于 2021-8-20 09:40 | 只看该作者
直接%.2f 这样写不行吗?楼主
回复

使用道具 举报

地板
ID:268736 发表于 2024-3-17 05:19 | 只看该作者
zyluglugl 发表于 2021-8-20 09:40
直接%.2f 这样写不行吗?楼主

我試了,還真的不行 ! 不過用版主的的方式真的農動作喔!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表