极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5342|回复: 0

给pcDuino上的Arduino串口库添加printf函数

[复制链接]
发表于 2014-1-7 11:23:13 | 显示全部楼层 |阅读模式
pcDuino上的Arduino串口的print函数用起来总是出现这样或那样的问题,而且一些参数也跟常规的不一样,用起来相当不方便。 本文将解决大家的不便,告诉大家如何在Arduino串口库添加printf函数 。

printf函数定义

printf 函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。函数的原型为:
int printf(const char *format, …);
函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。
printf()函数的调用格式为:printf(“<格式化字符串>”, <参量表>);
其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以”%”开始, 后跟一个或几个规定字符,用来确定输出内容格式。参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用”,”分开, 且顺序一一对应, 否则将会出现意想不到的错误。
注意:函数printf从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所以我们看见的结果是,从右边开始处理的。

添加printf函数

现在我们打印一段带参数的字符串,用Arduino现有的库如何实现:

Serail.print(“xxxxxx”);
Serail.print(x,HEX);
很明显比较麻烦,如果参数很多,要分成很多段。如果我们用printf函数,就是printf(fmt,…)。

如果用printf函数来实现上面的功能代码如下:
printf(“xxxxx%x”,x);
这样是不是很简单呢?

那么在pcDuino上如何用printf函数将数据从串口送出来呢?这就需要修改Arduino上的串口的库文件了。
修改 步骤如下:
1、在pcduino上arduino的库文件路径是:/usr/arduino/hardware/arduino/pcduino/core/arduion
我们打开 串口库的头文件 “Serail.h” ;
2 、在包含头文件的位置添加“#include<stdarg.h>”;
3、在Hwserial类的public函数中添加“void Printf(const char*fmt,…)”;
4、打开串口库的函数实现文件“Serail.cpp” ;
5、在函数实现文件中添加如下代码:
void Hwserial:rintf(const char *fmt,…)

{
int count;
char *buffer;
var_list Arglist;

count = 0;
buffer = (char*)malloc(128);
if(buffer == NULL)return;
va_start(Arglist,fmt);
vsprintf(buffer,fmt,Arglist);
while(buffer[count] != ‘\0′)this->write(buffer[count++]);
free(buffer);

}

这样就完成了。

现在我们打印一段带参数的字符串,用Arduino现有的库如何实现:

Serail.print(“xxxxxx”);
Serail.print(x,HEX);
很明显比较麻烦,如果参数很多,要分成很多段。如果我们用printf函数,就是printf(fmt,…)。

如果用printf函数来实现上面的功能代码如下:
printf(“xxxxx%x”,x);
这样是不是很简单呢?

那么在pcDuino上如何用printf函数将数据从串口送出来呢?这就需要修改Arduino上的串口的库文件了。
修改 步骤如下:
1、在pcduino上arduino的库文件路径是:/usr/arduino/hardware/arduino/pcduino/core/arduion
我们打开 串口库的头文件 “Serail.h” ;
2 、在包含头文件的位置添加“#include<stdarg.h>”;
3、在Hwserial类的public函数中添加“void Printf(const char*fmt,…)”;
4、打开串口库的函数实现文件“Serail.cpp” ;
5、在函数实现文件中添加如下代码:
void Hwserial:rintf(const char *fmt,…)

{
int count;
char *buffer;
var_list Arglist;

count = 0;
buffer = (char*)malloc(128);
if(buffer == NULL)return;
va_start(Arglist,fmt);
vsprintf(buffer,fmt,Arglist);
while(buffer[count] != ‘\0′)this->write(buffer[count++]);
free(buffer);

}

这样就完成了。


回复

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-9-29 05:01 , Processed in 0.042805 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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