2012-08-11 259 views
0

我的背景不在C中(它在Real Studio中 - 類似於VB),我真的很費力地分割逗號分隔的字符串,因爲我不習慣低級別字符串處理。分割逗號分隔的整數字符串

我正在通過串行發送字符串到Arduino。這些字符串是特定格式的命令。例如:

@20,2000,5! 
@10,423,0! 

'@'是表示新命令和'!'的標題,是標記命令結束的終止腳註。 '@'後面的第一個整數是命令ID,其餘的整數是數據(作爲數據傳遞的整數數量可以是0-10個整數)。

我寫了一個草圖,它獲取命令(剝離'@'和'!'),並在有命令處理時調用handleCommand()函數。問題是,我真的不知道如何分割這個命令來處理它!

這裏的草圖代碼: 「@ 20,2000,5」

String command; // a string to hold the incoming command 
boolean commandReceived = false; // whether the command has been received in full 

void setup() { 
    // put your setup code here, to run once: 
Serial.begin(9600); 
} 

void loop() { 
    // main loop 
    handleCommand(); 
} 

void serialEvent(){ 
    while (Serial.available()) { 
    // all we do is construct the incoming command to be handled in the main loop 

    // get the incoming byte from the serial stream 
    char incomingByte = (char)Serial.read(); 

    if (incomingByte == '!') 
    { 
     // marks the end of a command 
     commandReceived = true; 
     return; 
    } 
    else if (incomingByte == '@') 
    { 
     // marks the start of a new command 
     command = ""; 
     commandReceived = false; 
     return; 
    } 
    else 
    { 
     command += incomingByte; 
     return; 
    } 

    } 
} 

void handleCommand() { 

    if (!commandReceived) return; // no command to handle 

    // variables to hold the command id and the command data 
    int id; 
    int data[9]; 

    // NOT SURE WHAT TO DO HERE!! 

    // flag that we've handled the command 
    commandReceived = false; 
} 

說我的電腦發送的Arduino的字符串。我的草圖以String變量(稱爲command)結束,其中包含「20,2000,5」,並且commandRecieved布爾變量設置爲True,因此調用handleCommand()函數。

我想什麼在(目前無用)做handleCommand()功能是分配20到被叫id和2000和5至被叫data整數數組變量,即:

data[0] = 2000data[1] = 5等我已經閱讀了關於strtok()atoi(),但坦率地說,我只是無法擺脫他們和指針的概念。我相信我的Arduino草圖也可以進行優化。

+0

這兩個都是做這個的好方法。你也可以嘗試sscanf,如果它是可用的 – Gir 2012-08-11 15:33:01

+0

你能提供任何示例代碼?我在上圖中努力想出C代碼。我真的不知道如何使用我提到的兩種方法... – Garry 2012-08-11 15:38:29

回答

7

由於您使用Arduino的核心String類型,strtokstring.h功能是不恰當的。請注意,您可以可以更改您的代碼以使用標準C空終止的字符串,但使用Arduino String將允許您不使用指針來執行此操作。

String類型給你indexOfsubstring

假設與@!一個String剝離,找到你的命令和參數會是這個樣子:

// given: String command 
int data[MAX_ARGS]; 
int numArgs = 0; 

int beginIdx = 0; 
int idx = command.indexOf(","); 

String arg; 
char charBuffer[16]; 

while (idx != -1) 
{ 
    arg = command.substring(beginIdx, idx); 
    arg.toCharArray(charBuffer, 16); 

    // add error handling for atoi: 
    data[numArgs++] = atoi(charBuffer); 
    beginIdx = idx + 1; 
    idx = command.indexOf(",", beginIdx); 
} 

data[numArgs++] = command.substring(beginIdx); 

這會給你整個命令data陣中,包括在命令號碼data[0],而您已指定只有參數應在data之內。但是必要的變化很小。

+0

爲我工作,但我不得不調整最後一行爲: ' arg = command.substring(beginIdx); arg.toCharArray(charBuffer,16); data [numArgs] = atoi(charBuffer);' – onebeartoe 2015-12-22 17:00:42

-1

似乎工作,可能是車:

#include<stdio.h> 
#include <string.h> 

int main(){ 
char string[]="20,2000,5"; 
int a,b,c; 
sscanf(string,"%i,%i,%i",&a,&b,&c); 
printf("%i %i %i\n",a,b,c); 
a=b=c=0; 
a=atoi(strtok(string,",")); 
b=atoi(strtok(0,",")); 
c=atoi(strtok(0,",")); 
printf("%i %i %i\n",a,b,c); 

return 0; 
}