Show Posts
Pages: [1] 2 3 4
1  International / Deutsch / Re: read byte array on: July 30, 2014, 09:43:32 am
habs endlich hinbekommen...zum letzten Problem mit den Fehlermeldungen:
Irgendwie sind mir abhängigkeiten zu anderen projekten rein gerutscht, die hier die fehlermeldungen verursacht haben.
das hat sich erledigt.

hier nun mein fertiges und super laufendes script:

Code:
void checkForSerialData()
{
if(Serial.available() > 0)
{
if(commandByteReceived == false)
        {
commandID = Serial.read();

if (commandIDIsValid())
{
commandByteReceived = true;
inData[myIndex] = commandID;
myIndex++;

while(myIndex < messageLength)
{
if(Serial.available() > 0)
{
inData[myIndex] = Serial.read();
myIndex++;
}
}

runCommand();
myIndex = 0;
                commandByteReceived = false;
}
else
{
commandByteReceived = false;
myIndex = 0;
Serial.flush();
}

        }
}
}

boolean commandIDIsValid()
{
boolean validity = false;

switch(commandID)
{
case 0:
{
//setComet
validity = true;
messageLength = 8;
break;
}
case 1:
{
//stopComet
validity = true;
messageLength = 1;
break;
}
case 2:
{
//changeEndComet
validity = true;
messageLength = 3;
break;
}
case 3:
{
//setSpot
validity = true;
messageLength = 6;
break;
}
case 4:
{
//showKA
validity = true;
messageLength = 1;
break;
}
case 5:
{
//hideKA
validity = true;
messageLength = 1;
break;
}
case 6:
{
//startup
validity = true;
messageLength = 1;
break;
}
default:
{
Serial.println("wrong commandID");
validity = false;
}
}

return validity;
}



void runCommand()
{
Serial.print("run command");
Serial.println(commandID);

(*func_ptr[commandID])();
}

in den command methoden wird dann nur noch inData ausgewertet und die zugehörige aktion ausgeführt:

Code:
void setComet()
{
//Serial.println("setComet");

cometVisible = true;

cometStartPx = word(inData[1], inData[2]);
cometEndPx = word(inData[3], inData[4]);
cometSpeed = inData[5];
cometDirection = inData[6];
cometLength = inData[7];
 
comet_red.SetComet(cometVisible, cometStartPx, cometEndPx, cometSpeed, cometDirection, cometLength); 
}


VIiiiiieeeelen vielen dank für die Hilfe.
Finds richtig gut, dass hier auch solchen Anfängern wie mir geholfen wird ;-)
2  International / Deutsch / Re: read byte array on: July 30, 2014, 04:37:19 am
Kriege massig fehlermeldung zu folgendem code:

Code:
byte inData[10];
byte index = 0;
byte messageLength = 0;

void setup()
{
Serial.begin(9600);
}

void loop()
{
static boolean commandByteReceived;

if(Serial.available() > 0)
{
if(commandByteReceived == false)
        {
commandByteReceived = true;
            inData[index] = Serial.read();
calculateMessageLength(inData[index]);
index++;
        }
else if(Serial.available() >= 2 && index < messageLength)
{
byte high = Serial.read();
            byte low = Serial.read();
            inData[index] = word(high, low);
            Serial.println(word(high, low));
index++;

if (index == messageLength)
{
checkID(inData[0]);
index = 0;
                commandByteReceived = false;
}
}
}
}

void calculateMessageLength(int commandID)
{
switch(commandID)
{
case 5:
{
messageLength = 3;
break;
}
}
}

void checkID(int commandID)
{
Serial.println("checkID");


//TODO: function pointer
}

die meldungen lauten wie folgt:

Quote
ArduinoProtocol.ino:23: error: ISO C++ forbids comparison between pointer and integer
ArduinoProtocol.ino:27: error: invalid types 'byte [10][char*(const char*, int)]' for array subscript
ArduinoProtocol.ino:29: error: ISO C++ forbids incrementing a pointer of type 'char* (*)(const char*, int)'
ArduinoProtocol.ino:29: error: lvalue required as increment operand
ArduinoProtocol.ino:31: error: ISO C++ forbids comparison between pointer and integer
ArduinoProtocol.ino:34: error: assignment of function 'char* index(const char*, int)'
ArduinoProtocol.ino:34: error: cannot convert 'int' to 'char*(const char*, int)' in assignment
Error compiling

Kannst du damit was anfangen?
Schon die erste wundert mich...habe doch gar keinen pointer oder?
3  International / Deutsch / Re: read byte array on: July 30, 2014, 04:05:46 am
puuuh oh man das problem habe ich gelöst.
Und zwar ist die Proxy-Klasse zum Verbinden mit Arduino fehlerhaft.
Zumindest schreibt sie die Bytearrays falsch:

https://code.google.com/p/as3-arduino-connector/issues/detail?id=27

Ok dann mach ich jetzt mal weiter mit der auswertung
4  International / Deutsch / Re: read byte array on: July 30, 2014, 03:09:15 am
ich hab wirklich das gefühl, dass wir uns der lösung nähern.

ich versuche deshalb alles nochmal auf teilprobleme runter zu brechen.
zu aller erst möchte ich eigentlich gerne das bytearray verwenden.
sorry dass ich dich mit flash code belästige aber der sieht jetzt mal so aus:

Code:
var byteArray:ByteArray = new ByteArray();
byteArray.writeByte(5);
trace("byte array length: " + byteArray.length);
arduinoSocket.writeBytes(byteArray);

es wird wirklich nur ein byte gesendet laut length.

auf seiten von arduino möchte ich das byte auslesen und einfach nur wieder ausgeben:

Code:
if(Serial.available() > 0)
{
byte inByte3;
inByte3 = Serial.read();
Serial.println(inByte3);
}

leider bekomme ich niemals den wert zurück, den ich sende.
Komisch ist auch, dass ich beim starten des Serial monitors immer erstmal meherer 255 ausgegeben bekomme...wo können die denn her kommen und können die mir das ganze verfälschen?

5  International / Deutsch / Re: read byte array on: July 30, 2014, 01:47:20 am
Quote
Also ich kenne mich mit Flash nicht aus. Wenn ich das korrekt lese sind die Datentypen extrem stark eingeschränkt. Es gibt lediglich int und uint (32 Bit) und kein short (16 Bit). Das ist schon mal Scheiße. Wenn du damit ein int Array hast dann hat jeder Wert 4 Bytes.
Ansich hast du erstmal recht aber ByteArray gibt die Möglichkeit, ein short int zu schreiben. Dort werden dann lediglich die ersten 16 Bit geschrieben und der Rest ignoriert. Wenn ich also drauf achte, dass mein Wert nicht größer wird sollte das ja klappen.
http://help.adobe.com/de_DE/FlashPlatform/reference/actionscript/3/flash/utils/ByteArray.html#writeShort()

macht es eventuell sinn ans ende des ByteArrays ein Zeichen zur Markierung des Endes zu setzen und dann mit readBytesUntil zu lesen? Denn meine Nachrichten sind unterschieldich lang. manchmal wird nur ein command gesendet und manchmal noch bis zu 5 Parameter (je nach commandID). Bisher habe ich die Bytes immer noch mit 255 aufgefüllt um die richtige Länge zu erreichen.

Auf Empfangsseite musst du dann immer zwei Bytes auslesen. Dann muss man das Kommando Byte am Anfang getrennt behandeln. Geht vielleicht so
Code:
void checkForSerialData()
{
static boolean commandByteReceived;
        
        if(Serial.available() > 0)
{
        if(commandByteReceived == false)
                 {
                     commandByteReceived = true;
                     inData[index++] = Serial.read();
                 }
                else if(Serial.available() >= 2 && index < max_message_length)
{
byte high = Serial.read();
                        byte low = Serial.read();
                        inData[index++] = word(high, low);
                        Serial.println(word(high, low));

if (index == max_message_length)
{
checkID(inData[0]);
index = 0;
                                commandByteReceived = false;
}
}
}
}

ahh cool das mit dem word kann ich gut gebrauchen. hab mich nämlich schon gefragt wie ich die einzelnen bytes dann wieder zu nem integer zusammen fügen kann.

Vielen Dank für deine Hilfe.
6  International / Deutsch / Re: read byte array on: July 29, 2014, 09:31:37 am
Alternativ geht vielleicht sowas in der Art:
Code:
for (var i:int = 0; i < message.length; i++)
{
    socket.writeByte(message[i]);
}

das war schonmal gut. so kommt jetzt erstmal kein mist mehr an.
AAAber es gibt dann da noch ein weiteres Problem:
Und zwar muss ich auch werte schicken die größer sind als 256.
Wie gehe ich dann damit um?
7  International / Deutsch / read byte array on: July 29, 2014, 08:24:24 am
Hallo,

hab da nen Problem.
Und zwar nutze ich die ArduinoConnector um mit einer Flash Applikation zu kommunizieren.
Hierfür füge ich einem ByteArray 6 integer hinzu und schicke sie über den Socket zum Arduino

Code:
override public function send():void
{
var byteArray:ByteArray = new ByteArray();

for (var i:int = 0; i < message.length; i++)
{
byteArray.writeByte(message[i]);
}

socket.writeBytes(byteArray);

timer.start();
}

Nun schaffe ich es nicht diese Werte auf Seiten von Arduino vernünftig auszulesen und je nach Wert die richtige Methode auszuführen.

Hier mein bisheriger code:
Code:
void loop()

  //cmdMessenger.feedinSerialData();

  checkForSerialData();
 
  layerManager.Trigger();

  delay(10);
}

void checkForSerialData()
{
while(Serial.available() > 0)
{
if(index < max_message_length)
{
inByte = Serial.read(); // Read a Byte
Serial.println(inByte);
inData[index] = inByte; // Store it
index++;
if (index == max_message_length)
{
checkID(inData[0]);
index = 0;
}
}
}
}

in der methode checkID() wird dann geprüft ob die erste empfangene Zahl einer ID entspricht, die wiederum zugehörig zu einer Methode ist. Wenn die IDs übereinstimmen wird diese Methode ausgeführt und verwendet dann die restlichen Zahlen aus inData[].

Leider komme ich nie soweit, da die IDs niemals matchen. Wenn ich inByte ausgeben lasse werden ganz andere Zahlen angezeigt als ich schicke.
Was mache ich hier falsch?

btw inByte und inData sind vom Typ int

Ich hoffe mir kann jemand helfen. Weiß nicht mehr weiter.
Vielen Dank schonmal
8  International / Deutsch / Re: Arduino due NeoMatrix video wall on: July 11, 2014, 07:39:31 am
Quote
Bei ARM Prozessoren wie dem Due, sollte const reichen. -> http://forum.arduino.cc/index.php?topic=128685.msg968721#msg968721

Kannst du mir das eventuell näher erläutern?
Ich habe 5 pngs, die ich im Speicher haben möchte. Wie geh ich da am Besten vor?
9  International / Deutsch / Re: Google Protocoll Buffers zur Kommunikation zwischen Flash-Anwendung und Arduino on: June 05, 2014, 09:55:43 am
Wenn ich die einzelnen Zahlenwerte in ein ByteArray schreibe und dann schicke ist es doch bestimmt besser, als wenn ich mir einen String mit Trennzeichen zusammen bastel und dann schicke oder? So hab ich ja schonmal nicht den overhead der Trennzeichen.
Die Frage ist, wie ich an den Anfang die Länge bekomme. Nicht jeder Zahlenwert braucht ja ein Byte oder? Oder kann ich einfach sagen, dass wenn ich 5 Zahlen (nicht größer als 255) in ein ByteArray schreibe, dass dann auch die Anzahl der Bytes gleich 5 ist? Wird auch für eine integer 1 ein Byte verwendet? Oh oh oh hab ganz schön Nachholbedarf was Datentypen und deren Speicheralokierung angeht ^^

Ich hoffe ihr bringt mir etwas Licht ins dunkel.

Ok angenommen ich habe dann das ByteArray abgeschickt mit der dann hoffentlich vorangestellten Länge.
Dann erzeuge ich einen statischen Puffer:
Code:
uint8_t in_buffer[10];
Dann schreibe ich mit der Größe auf folgende Weise in den Puffer:
Code:
Serial.readBytes((uint8_t*)in_buffer, packet_size);
führt er dann readBytes erst aus wenn auch wirklich die durch die Länge packet_size angegebene Länge an Paketen angekommen ist?

Hast du nicht vielleicht ein kleines Codebeispiel für mich?
10  International / Deutsch / Re: Google Protocoll Buffers zur Kommunikation zwischen Flash-Anwendung und Arduino on: June 05, 2014, 09:12:04 am
OK das mit den Funktionszeiger ist ja schonmal cool. Danke dafür.

Den Teil davor habe ich noch nicht verstanden:

ok das erste Byte ist die Länge. So weit so gut.
Und dann? In eine Puffer schrieben? Oder wie komme ich dann wirklich an die Werte?
Kann ich wenn die Funktion aufgerufen wird wirklich sicher sein, dass alle Werte schon im Serial bereit stehen?
Nicht, dass ich ein Serial.read() aufrufe und der Wert noch gar nicht übermittelt wurde.

Manche arbeiten ja mit if(Serial.available() == size) oder sowas aber ich habe gelesen, dass es nicht gut ist das zu machen, da durchaus auch Bytes verloren gehen könnten und dann alles durcheinader kommt.
11  International / Deutsch / Re: Google Protocoll Buffers zur Kommunikation zwischen Flash-Anwendung und Arduino on: June 05, 2014, 08:58:20 am
Wie schon beschrieben gibt es verschiedene Nachrichten in verschiedenen Längen.
Der erste integer Wert soll immer eine Methode aufrufen. Dann folgt eine bestimmte Anzahl von Parametern, je nachdem welche ID der erste Wert hat.

z.b. könnten Nachrichten so aussehen

1,3,90,140,4;
2,30,120;
3;
4,9;
5,7,10,30,120,9;

Die Werte werden in ein ByteArray geschrieben und dann gesendet.
Die Frage ist jetzt wie ich das am Besten auf Seiten von Arduino interpretieren kann.
Mit dem CmdMessenger hat es eigentlich ganz gut geklappt, aber wenn es zu viele Nachrichten auf einmal waren die geschickt wurden, ist das Board anscheinend nicht mehr hinterher gekommen

Mir fehlt da auch etwas Hintergrundwissen:

Wenn ich zum beisiel im loop sowas mache:
Code:
if(Serial.available())
{
int comand = Serial.read();
}

und dann in einer switch case abfrage welche ID das ist, dann jeweils eine Methode aufrufe und in dieser dann mehrmals hintereinander Serial.read() aufgerufen wird, klappt das dann? Kann ich sicher stellen, dass dann wirklich schon alle Zeichen rein gekommen sind? eigentlich nicht oder? Muss ich solange in einen buffer einlesen bis das semikolon am ende gekommen ist und dann am ende den buffer auseinander pflücken? Wenn ja dann ist genau das doch das was der CmdMessenger tut oder? Ich weiß einfach nicht was ich besser machen soll als der CmdMessenger  smiley-roll-sweat smiley-cry smiley-sad
12  International / Deutsch / Re: Google Protocoll Buffers zur Kommunikation zwischen Flash-Anwendung und Arduino on: June 05, 2014, 08:38:00 am
kann mir jemand helfen wie ich eine sichere und stabile kommunikation realisieren kann?
13  International / Deutsch / Re: Google Protocoll Buffers zur Kommunikation zwischen Flash-Anwendung und Arduino on: June 05, 2014, 07:57:01 am
hat sich wohl schon erledigt.
die Flash library scheint schon ne macke zu haben.

nichtmal das funktioniert:

Code:
var ambient:hello = new hello();
var byteArray:ByteArray = new ByteArray();

ambient.data = "hallo";
ambient.writeTo(byteArray);

var ambient2:hello = new hello();
ambient2.mergeFrom(byteArray);
trace(ambient2.data);
14  International / Deutsch / Re: Google Protocoll Buffers zur Kommunikation zwischen Flash-Anwendung und Arduino on: June 05, 2014, 02:44:12 am
Was auf den LEDs abläuft ist deutlich komplexer als nur an aus oder rot und blau.
Es werden aufgrund von Parametern verschiedene komplexe Objekte generiert, die auf verschiedenen LED-Bändern angezeigt werden.

Nur als Beispiel: Es soll ein Streifen, der 10 Pixel lang ist, einen Verlauf von rot nach grün hat auf obersten Layer vom 40. zum 100. Pixel laufen mit einer Geschwindigkeit von 3 Pixeln pro Frame.

Hierfür muss eine Methode aufgerufen werden, die verscheidene Parameter braucht.
15  International / Deutsch / Re: Google Protocoll Buffers zur Kommunikation zwischen Flash-Anwendung und Arduino on: June 05, 2014, 02:30:07 am
Quote
Welchen CommandMessenger hast Du verwendet?
http://playground.arduino.cc/Code/CmdMessenger

Quote
Was meinst Du mit "Flash Anwendung"? Willst Du eine Adobe Air-Anwendung mit dem Arduino kommunizieren lassen?
Ja genau.

Quote
Erkläre uns, was Du erreichen willst und nicht, wie Du es erreichen willst.
Letzt endlich möchte ich gesteuert von Flash aus verschiedene Aktionen auf dem Arduino ausführen, das wiederum verschiedene LED-Bänder steuert.

Flash hat verschiedene Nachrichten mit unterschiedlich vielen Parametern, die ans Arduino übermittelt werden sollen.
Der Command Messenger war mir sehr attraktiv, da ich nicht hundferte if else Verzeweigungen schrieben brauche und er das Mapping von der Command ID auf eine Methode gemacht hat. Sehr komfortabel in der Bedienung. Aber eben mit angesprochenen Problemen.
Pages: [1] 2 3 4