Wifly ライブラリを使用して TCP 経由で送信されるシリアル コマンドを常にチェックする Arduino に次のコードがあります。
次のコードは、シリアル経由で送信されたときに、次のように文字列を分割します。
{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!
}