Hat mir keine Ruhe gelassen, wenn mir schon jemand helfen möchte.
Leicht angepasster CMDMessenger. Einfügen einer LED als Indikator.
#include <CmdMessenger.h>
#include <Base64.h>
#include <Streaming.h>
char field_separator = ',';
char command_separator = ';';
CmdMessenger cmdMessenger = CmdMessenger(Serial, field_separator, command_separator);
int speed[3];
enum
{
kCOMM_ERROR = 000, // Lets Arduino report serial port comm error back to the PC (only works for some comm errors)
kACK = 001, // Arduino acknowledges cmd was received
kARDUINO_READY = 002, // After opening the comm port, send this cmd 02 from PC to check arduino is ready
kERR = 003, // Arduino reports badly formatted cmd, or cmd not recognised
kSEND_CMDS_END, // Mustnt delete this line
};
messengerCallbackFunction messengerCallbacks[] =
{
bens_msg, // 004 in this example
jerrys_base64_data, // 005
NULL
};
// ------------------ C A L L B A C K M E T H O D S -------------------------------------------------------
void bens_msg()
{
cmdMessenger.sendCmd(kACK,"bens cmd recieved");
digitalWrite(40, HIGH);
delay(2000);
digitalWrite(40, LOW);
while ( cmdMessenger.available() )
{
char buf[50] = { '\0' };
cmdMessenger.copyString(buf, 50);
if(buf[0])
cmdMessenger.sendCmd(kACK, buf);
}
}
//-----------------------------------------------------------------------------------------------------------
void jerrys_base64_data()
{
char buf[350] = { '\0' };
boolean data_msg_printed = false;
cmdMessenger.sendCmd(kACK,"jerrys cmd recieved");
// base64 decode
while ( cmdMessenger.available() )
{
if(!data_msg_printed)
{
cmdMessenger.sendCmd(kACK, "what you send me, decoded base64...");
data_msg_printed = true;
}
char buf[350] = { '\0' };
cmdMessenger.copyString(buf, 350);
if(buf[0])
{
char decode_buf[350] = { '\0' };
base64_decode(decode_buf, buf, 350);
cmdMessenger.sendCmd(kACK, decode_buf);
}
}
// base64 encode
if(!data_msg_printed)
{
cmdMessenger.sendCmd(kACK, "\"the bears are allright\" encoded in base64...");
char base64_msg[350] = { '\0' };
base64_encode(base64_msg, "the bears are allright", 22);
cmdMessenger.sendCmd(kACK, base64_msg);
}
}
// ------------------ D E F A U L T C A L L B A C K S -----------------------
void arduino_ready()
{
// In response to ping. We just send a throw-away Acknowledgement to say "im alive"
cmdMessenger.sendCmd(kACK,"Arduino ready");
}
void unknownCmd()
{
// Default response for unknown commands and corrupt messages
cmdMessenger.sendCmd(kERR,"Unknown command");
}
// ------------------ E N D C A L L B A C K M E T H O D S ------------------
// ------------------ S E T U P ----------------------------------------------
void attach_callbacks(messengerCallbackFunction* callbacks)
{
int i = 0;
int offset = kSEND_CMDS_END;
while(callbacks[i])
{
cmdMessenger.attach(offset+i, callbacks[i]);
i++;
}
}
//---------------------------------------------------------------------------------------------------------------------
void setup()
{
// Listen on serial connection for messages from the pc
// Serial.begin(57600); // Arduino Duemilanove, FTDI Serial
Serial.begin(9600); // Arduino Uno, Mega, with AT8u2 USB
Serial.println("**************************");
Serial.println("* Quad102 *");
Serial.print ("* ");Serial.print(__DATE__);Serial.print(" ");Serial.print(__TIME__);Serial.println(" *");
Serial.println("**************************");
Serial.flush();
// cmdMessenger.discard_LF_CR(); // Useful if your terminal appends CR/LF, and you wish to remove them
cmdMessenger.print_LF_CR(); // Make output more readable whilst debugging in Arduino Serial Monitor
// Attach default / generic callback methods
cmdMessenger.attach(kARDUINO_READY, arduino_ready);
cmdMessenger.attach(unknownCmd);
// Attach my application's user-defined callback methods
attach_callbacks(messengerCallbacks);
arduino_ready();
// blink
pinMode(13, OUTPUT);
pinMode(40, OUTPUT);
digitalWrite(40, LOW);
}
// ------------------ M A I N ( ) --------------------------------------------
// Timeout handling
long timeoutInterval = 2000; // 2 seconds
long previousMillis = 0;
int counter = 0;
void timeout()
{
// blink
if (counter % 2)
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
counter ++;
}
void loop()
{
// Process incoming serial data, if any
cmdMessenger.feedinSerialData();
// handle timeout function, if any
if ( millis() - previousMillis > timeoutInterval )
{
//timeout();
previousMillis = millis();
}
// Loop.
}
Aus Processing kommen diese Versuche:
s = "4,50,50,50,50;";
portQuad.write(s);
oder
//portQuad.write(convertStringToByteArray(s));
Keine Reaktion der LED
Bei der Eingabe von 4,50,50,50,50; über den SeriellMonitor alles OK und LED leuchtet 2sec.
Reichen diese Angaben?
LGW