我有一些代码,我不知道为什么它不起作用。
代码采用" xxx,yyy,zzz"形式的串行输入,其中每个数字的数字范围为1到3。由于应用程序中存在奇怪的怪癖,因此需要将其作为char读取,然后转换为要处理的字符串。目的是分为3个整数,红绿色和蓝色,来自" RRR,GGG,BBB"。
现在,当我手动定义String str(请参阅注释代码)时,这可以正常工作,但是当我从串行控制台输入它时,它并不想工作。它似乎来自indexOf(',')部分,因为在使用Serial.print(c1);时,我发现当我手动输入字符串时,它返回了逗号的索引,但是当我使用串行控制台时,它返回-1(未找到)。
是的,进入控制台的字符串格式正确为" RRR,GGG,BBB"我已经确认通过独立打印手机和str。
while (Serial.available() > 0) {
char phone = Serial.read();
String str = String(phone);
//String str = "87,189,183";
int ln = str.length()-1;
int c1 = str.indexOf(','); //first place to cut string
int c2 = str.indexOf(',',c1+1); //second place
red = str.substring(0,c1).toInt();
green = str.substring(c1,c2).toInt();
blue = str.substring(c2,ln).toInt();
Serial.print(red);
编辑:使用Arduino String类,从char创建一个字符串不仅仅返回一个字符,实际上是十一个字符。
答案 0 :(得分:1)
此:
char phone = Serial.read();
String str = String(phone);
永远不会在str
中创建一个包含超过1个字符的字符串,因为这就是您所说的内容。
这是the Arduino's String(char)
constructor的代码:
String::String(char c)
{
init();
char buf[2];
buf[0] = c;
buf[1] = 0;
*this = buf;
}
很明显,你的代码会创建一个1个字符的长字符串。
另外,请注意在完整字符串上使用索引,稍后在子字符串上使用。
答案 1 :(得分:1)
我试图猜测您使用的是这些串行API http://playground.arduino.cc/Interfacing/CPPWindows。
while (Serial.available() > 0) {
char buf[12];
int len = Serial.ReadData(buf,11);
String str = String(buf);
//String str = "87,189,183";
int ln = str.length()-1;
int c1 = str.indexOf(','); //first place to cut string
int c2 = str.indexOf(',',c1+1); //second place
red = str.substring(0,c1).toInt();
green = str.substring(c1,c2).toInt();
blue = str.substring(c2,ln).toInt();
Serial.print(red);
如果您使用的是http://arduino.cc/en/Serial/Read之类的其他API,则应遵循这些API,其中Serial为Stream,read()
返回只是第一个可用的字符。
答案 2 :(得分:0)
使用不同的函数修复了代码。
while (Serial.available() > 0) {
char phone = Serial.read();
str += phone;
//String str = "87,189,183";
int ln = str.length()-1;
int c1 = str.indexOf(','); //first place to cut string
int c2 = str.indexOf(',',c1+1); //second place
red = str.substring(0,c1).toInt();
green = str.substring(c1,c2).toInt();
blue = str.substring(c2,ln).toInt();
Serial.print(red);
我不确定为什么会这样,以及为什么在我收到一个包含多个字符的字符串之前。但它有效!