Gram z programowaniem dla Arduino, ale dzisiaj natknąłem się na problem, którego nie mogę rozwiązać dzięki mojej bardzo ograniczonej znajomości języka C. Oto, jak to działa. Tworzę aplikację komputerową, która wysyła dane szeregowe do arduino (deviceID, command, commandparameters). Ten arduino przekaże to polecenie przez RF do innych arduino. w zależności od identyfikatora urządzenia właściwy arduino wykona polecenie.Podziel ciąg na tablicę ciągów
Aby móc określić identyfikator urządzenia, chcę podzielić ten ciąg na ",". to jest mój problem, wiem, jak to zrobić z łatwością w java (nawet bez użycia standardowej funkcji podziału), jednak w C to zupełnie inna historia.
Czy ktokolwiek z was może mi powiedzieć, jak to działa?
dzięki
/*
Serial Event example
When new serial data arrives, this sketch adds it to a String.
When a newline is received, the loop prints the string and
clears it.
A good test for this is to try it with a GPS receiver
that sends out NMEA 0183 sentences.
Created 9 May 2011
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/SerialEvent
*/
String inputString; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
String[] receivedData;
void setup() {
// initialize serial:
Serial.begin(9600);
// reserve 200 bytes for the inputString:
inputString.reserve(200);
}
void loop() {
// print the string when a newline arrives:
if (stringComplete) {
Serial.println(inputString);
// clear the string:
inputString = "";
stringComplete = false;
}
}
/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
if (inChar == '\n') {
stringComplete = true;
}
// add it to the inputString:
if(stringComplete == false) {
inputString += inChar;
}
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
}
}
String[] splitCommand(String text, char splitChar) {
int splitCount = countSplitCharacters(text, splitChar);
String returnValue[splitCount];
int index = -1;
int index2;
for(int i = 0; i < splitCount - 1; i++) {
index = text.indexOf(splitChar, index + 1);
index2 = text.indexOf(splitChar, index + 1);
if(index2 < 0) index2 = text.length() - 1;
returnValue[i] = text.substring(index, index2);
}
return returnValue;
}
int countSplitCharacters(String text, char splitChar) {
int returnValue = 0;
int index = -1;
while (index > -1) {
index = text.indexOf(splitChar, index + 1);
if(index > -1) returnValue+=1;
}
return returnValue;
}
zdecydowałem Zamierzam użyć funkcji strtok
. Teraz mam inny problem. Błąd stało jest
SerialEvent.cpp: In function 'void splitCommand(String, char)':
SerialEvent:68: error: cannot convert 'String' to 'char*' for argument '1' to 'char* strtok(char*, const char*)'
SerialEvent:68: error: 'null' was not declared in this scope
Code jest jak
String inputString; // a string to hold incoming data
void splitCommand(String text, char splitChar) {
String temp;
int index = -1;
int index2;
for(temp = strtok(text, splitChar); temp; temp = strtok(null, splitChar)) {
Serial.println(temp);
}
for(int i = 0; i < 3; i++) {
Serial.println(command[i]);
}
}
Spójrz na funkcję 'strtok()'. –
'strtok' jest amortyzowany. zamiast tego użyj 'strsep' zamiast – waspinator
Dla przyszłego odniesienia, AFAIK' strtok() 'jest _nie_nie uznawane za przestarzałe (lub deprecjonowane). Kompilator MS Visual C++ wyróżnia go jako niebezpieczną reklamę i alternatywę, podobnie jak GNU/POSIX (różne alternatywy). Użyte prawidłowo i ze świadomością jego wad, będzie działać zgodnie z przeznaczeniem. – Toby