使用Arduino IDE,我试图从Serial中读取一个字符串,在我需要处理它之后,从中分离一些字节。该字符串以@
开头,以;
结尾。 "部分"数据是:
例如,如果我有字符串@002001100.0;
,则A部分为002,B部分为001,C部分为100.0。
从Serial读取整个字符串,我正在做
char UsartBuffer = 0;
char UsartString[64];
boolean commandReceived = false;
if (Serial.available() >0) {
UsartBuffer = Serial.read();
UsartString[0] = UsartBuffer;
int counter = 0;
if (UsartBuffer == '@'){
while (UsartBuffer != ';'){
if (Serial.available() >0){
UsartBuffer = Serial.read();
if (UsartBuffer != ' '){
counter++;
UsartString[counter] = UsartBuffer;
}
}
}
UsartString[counter+1]='\0';
commandReceived = true;
}
}
为了分割我做的字符串
char* getClass(String command){
char returnStr[3];
for (int i = 0; i < 3; i++){
returnStr[i] = command[i+1];
}
return returnStr;
}
char* getSubClass(String command){
char returnStr[3];
for (int i = 0; i < 3; i++){
returnStr[i] = command[i+4];
}
return returnStr;
}
char* getDataValue(String command){
char returnStr[56];
int lastByte = 56;
for (int i=0; i<56; i++){
if (command[i+7]==';'){
lastByte = i;
break;
}
}
for (int i = 0; i < lastByte; i++) returnStr[i] = command[i+7];
for (int i = lastByte; i < 56; i++) returnStr[i] = '/0';
return returnStr;
}
当我做的时候
if (commandReceived){
Serial.println(UsartString);
Serial.println(getClass(UsartString));
Serial.println(getSubClass(UsartString));
Serial.println(getDataValue(UsartString));
}
我得到了甚至奇怪的结果:
@002000107.0;
a
!œ
107.0Ñ
因此,我做错了什么?
提前致谢。
答案 0 :(得分:1)
问题原因在于getClass()
,getSubClass()
和getDataValue()
返回本地变量(returnStr
)。一旦函数返回,这些值就会丢失。
避免这种情况的几种方法:
返回一个String
对象(本地String
将在离开函数的路上被复制):
String getClass(String command) {
String returnStr;
for (int i = 0; i < 3; i++) {
returnStr += command[i+1];
}
return returnStr;
}
在函数中动态分配char*
(使用malloc()
) - 如果这样做,您需要小心后再解除分配(使用free()
):
char* getClass(String command) {
size_t length = 3;
char* returnStr = (char*) malloc(length);
for (int i = 0; i < length; i++) {
returnStr[i] = command[i+1];
}
return returnStr;
}
// Usage
char* classStr = getClass(UsartString);
Serial.println(classStr);
free(classStr);
将预先分配的char
数组传递给函数 - 这可以是调用函数中的局部变量:
void getClass(String command, char* returnStr) {
for (int i = 0; i < 3; i++) {
returnStr[i] = command[i+1];
}
return returnStr;
}
// Usage
char returnStr[3];
getClass(UsartString, returnStr);
Serial.println(returnStr);