У меня на Arduino следующий код, который постоянно проверяет последовательную команду, отправляемую по TCP с использованием библиотеки Wifly.
То, что делает следующий код, разбивает строку наподобие следующей при отправке через последовательный порт:
{power,tv}
Он устанавливает эти свойства соответственно:
char command[32];
char value[32];
Затем он выполняет определенные методы, используя sendCommand(command, value);
на основе свойств, установленных в цикле ниже.
Имейте в виду, что это прекрасно работает с библиотекой Wifly.
void loop() {
Client client = server.available();
if (client) {
boolean start_data = false;
boolean next = false;
char command[32];
char value[32];
int index = 0;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.print(c);
if (c == '}') {
break;
}
if(start_data == true) {
if(c != ',') {
if(next)
value[index] = c;
else
command[index] = c;
index++;
} else {
next = true;
command[index] = '\0';
index = 0;
}
}
if (c == '{') {
start_data = true;
}
}
}
value[index] = '\0';
client.flush();
client.stop();
sendCommand(command,value);
}
}
Вместо использования WiFi я купил несколько модулей Xbee. В основном они также позволяют отправлять последовательные байты. Единственная проблема в том, что я не совсем уверен, как справиться с циклом, учитывая, что while(client.connected())
больше нет. Вместо этого я использовал while(Serial.available())
, думая, что это будет работать, но по какой-то причине он не устанавливает свойство value
.
Я получаю command
, но не получаю value
.
Кроме того, я не уверен, является ли вышеприведенный цикл лучшим способом сделать то, что мне нужно, все, что я знаю, это то, что он работает просто так, как есть. :)
Вот мой новый цикл, который возвращает только command
, а не value
по некоторым причинам:
void loop() {
// if there are bytes waiting on the serial port
if (Serial.available()) {
boolean start_data = false;
boolean next = false;
char command[32];
char value[32];
int index = 0;
while (Serial.available()) {
char c = Serial.read();
Serial.print(c);
if (c == '}') {
break;
}
if(start_data == true) {
if(c != ',') {
if(next)
value[index] = c;
else
command[index] = c;
index++;
} else {
next = true;
command[index] = '\0';
index = 0;
}
}
if (c == '{') {
start_data = true;
}
}
value[index] = '\0';
sendCommand(command,value);
}
}
Если следующее работает с новым циклом, я буду очень счастлив!
void sendCommand(char *command, char *value) {
// do something wonderful with command and value!
}