我必须从一台计算机管理舵机。
所以我要送管理从电脑消息的Arduino。 我需要管理伺服和角落的数量。 我想寄来像这样的:“1 130”(第一伺服和角130,分隔符“;”)。
是否有更好的方法来做到这一点?
这里是我的代码:
String foo = "";
void setup(){
Serial.begin(9600);
}
void loop(){
readSignalFromComp();
}
void readSignalFromComp() {
if (Serial.available() > 0)
foo = '';
while (Serial.available() > 0){
foo += Serial.read();
}
if (!foo.equals(""))
Serial.print(foo);
}
这是行不通的。 有什么问题?
- 您可以使用Serial.readString()和Serial.readStringUntil()从串口上的Arduino解析字符串
- 您还可以使用Serial.parseInt()来读取串口整数值
代码示例
int x;
String str;
void loop()
{
if(Serial.available() > 0)
{
str = Serial.readStringUntil('\n');
x = Serial.parseInt();
}
}
以通过串口发送的值将是“我的字符串\ N5”,其结果将是海峡=“我的字符串”和X = 5
这是一个大子,我发现。 这是超级有益的,我希望这将是你。
这是调用的子方法。
String xval = getValue(myString, ':', 0);
这是次!
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {
0, -1 };
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(data.charAt(i)==separator || i==maxIndex){
found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}
大多数其他的答案要么是非常冗长或非常一般,所以我想我给它如何可以使用Arduino的库您的具体的例子来完成一个例子:
您可以使用该方法Serial.readStringUntil阅读,直到你的分隔符从Serial
端口。
然后使用toInt将字符串转换为整数。
因此,对于一个完整的例子:
void loop()
{
if (Serial.available() > 0)
{
// First read the string until the ';' in your example
// "1;130" this would read the "1" as a String
String servo_str = Serial.readStringUntil(';');
// But since we want it as an integer we parse it.
int servo = servo_str.toInt();
// We now have "130\n" left in the Serial buffer, so we read that.
// The end of line character '\n' or '\r\n' is sent over the serial
// terminal to signify the end of line, so we can read the
// remaining buffer until we find that.
String corner_str = Serial.readStringUntil('\n');
// And again parse that as an int.
int corner = corner_str.toInt();
// Do something awesome!
}
}
当然,我们可以简化这个有点:
void loop()
{
if (Serial.available() > 0)
{
int servo = Serial.readStringUntil(';').toInt();
int corner = Serial.readStringUntil('\n').toInt();
// Do something awesome!
}
}
你需要建立一个读缓冲区,并计算您的2场(伺服#,和角)开始和结束。 然后,你可以阅读他们,并转换成字符整数在你的代码的其余部分使用。 像这样的东西应该工作(在Arduino的没有测试,但标准C):
void loop()
{
int pos = 0; // position in read buffer
int servoNumber = 0; // your first field of message
int corner = 0; // second field of message
int cornerStartPos = 0; // starting offset of corner in string
char buffer[32];
// send data only when you receive data:
while (Serial.available() > 0)
{
// read the incoming byte:
char inByte = Serial.read();
// add to our read buffer
buffer[pos++] = inByte;
// check for delimiter
if (itoa(inByte) == ';')
{
cornerStartPos = pos;
buffer[pos-1] = 0;
servoNumber = atoi(buffer);
printf("Servo num: %d", servoNumber);
}
}
else
{
buffer[pos++] = 0; // delimit
corner = atoi((char*)(buffer+cornerStartPos));
printf("Corner: %d", corner);
}
}
它看起来像你只需要更正
foo = ''; >>to>> foo = "";
foo += Serial.read(); >>to>> foo += char(Serial.read());
我做了也shomething相似..:
void loop(){
while (myExp == "") {
myExp = myReadSerialStr();
delay(100);
}
}
String myReadSerialStr() {
String str = "";
while (Serial.available () > 0) {
str += char(Serial.read ());
}
return str;
}