2013-04-10 153 views
0

我正在编写一个Arduino库,用于使用串行馈送在Arduino和计算机之间进行简单的数据传输。我创建了库等。但是,我遇到了一个char数组问题,并添加了一个冒号(':')。也就是说,在C++中向一个无符号字符添加冒号(:)

//Sends data via println() 
void simpleTransfer::sendData(char *name, char *data){ 
    char *str = name + ": " + data + ","; 
    _serial->println(str); //Sends in form 'name: data,' 
} 

这应该是我要发送,添加一个冒号和一个空格,我要发送的数据和最后一个逗号变量的名称。不过,我不是得到错误信息:

的类型 '字符*' 无效的操作数和 '为const char [3]' 二进制 '运营商+'

的原因是什么?

+2

您正在寻找*字符串连接*。添加两个指针不会那样做。 – 2013-04-10 16:45:30

+0

感谢您的帮助 – jacobsax 2013-04-11 08:35:25

回答

2

你可以使用sprintf

char str[64]; // Or whatever length you need to fit the resulting string 
sprintf(str, "%s:%s,", name, data); 

或者strcpy/strcat

char str[64]; 
strcpy(str, name); 
strcat(str, ":"); 
strcat(str, data); 
strcat(str, ","); 


或者只是使用C++的std::string

+0

与上面相同的注释:'std :: string'不适用于Arduino。 'sprintf'方法更好,但需要拉入某些库,这会显着增加代码的大小,这在Arduino中也是不可取的 – angelatlarge 2013-04-11 02:32:44

3

简答题:使用std::string来创建连接字符串。

std::string s = ((std::string(name) + ": ") + data) + ","; 
_serial->println(s.c_str()); 

长答案:连接C风格的字符串时,您需要一个足够大的目标缓冲区来保存结果。如果您知道结果可以达到的最大大小,则可以声明该大小的本地数组,并使用sprintf作为其他答案的解释。或者,如果您事先不知道大小,则可以使用strlennew[]的组合来分配动态大小的缓冲区,执行打印,然后执行delete[]的缓冲区。但不要这样做!改为使用字符串类别std::string,或者在下面的评论中提及Drew Dormann,Arduino专有String类。

+1

......从我所知道的来看,Arduino的C++实现没有头文件'',但提供了一个'String'类型来支持您编写的语法。如果我错了,请纠正我,任何人。 :) – 2013-04-10 16:54:40

+0

@DrewDormann:哦,我不知道Arduino有那个! http://arduino.cc/en/Reference/StringObject – 2013-04-10 17:01:11

+0

你真的不想在Arduino上使用标准C++库:这是一个低资源平台。出于这个原因,它有自己的字符串实现。 – angelatlarge 2013-04-11 02:31:27