Go Down

Topic: Arduino<->Android Kommunikation via RedFly Wifishield(Problem der Datengroesse) (Read 2 times) previous topic - next topic

mkl0815

Du kannst einen Wert in einen C-String umwandeln und diesen dann senden
Code: [Select]

char buffer[25];
sprintf(buffer,"%d",1024);
socketSend(socket,buffer,ip,port);

Dabei kommt aber nicht der Wert 1024 auf der Gegenseite an, sondern die Zeichen '1','0','2','4'. Du mußt dann also daraus auf der Gegenseite wieder eine Zahl machen.
Du kannst aber somit mehrere Werte auf einen Schalg senden, wenn Du mit sprintf() mehrere Werte in den Puffer schreibst (der dann ggf. größer sein muss)

Alternativ kannst Du auch das Integer direkt senden:
Code: [Select]

int value =1024
socketSend(socket,&value,2,ip,port);

&value ist dabei die Adresse an welcher der Wert steht und die 2 steht für die Anzahl an Bytes die gesendet werden müssen (2 bei Integer).

Micke

Code: [Select]
char buffer[25];
sprintf(buffer,"%d",1024);
socketSend(socket,buffer,ip,port);


klappt soweit erstmal, danke.
habs erstmal am serial monitor wieder ausgegeben. aber im speicher an der addresse von buffer[8] z.B: steht noch quatsch der da garnicht hingehoert. Also dachte ich mir ich änder es zu folgendem ab.

Code: [Select]

int bla = 1024;
char buffer[sizeof(bla)];        
sprintf(buffer,"%d",bla);
Serial.println("");
for(int i = 0; i < sizeof(bla); i++)
{
   Serial.print(buffer[i]);
}
Serial.println("");

die Ausgabe lautet jetzt 10     es fehlen also  24  

was kann ich dagegen tun? ich will das der buffer immer nur genauso viele stellen hat wie die eigentliche zahl, so könnte ich ja dann auch beliebige strings in ein chararray packen.



die andere Methode habe ich auch probiert, klappt leider nicht.
Code: [Select]

int value = 1024;
RedFly.socketSend(hUDP,&value,sizeof(value),ip,UDP_PORT);


Quote

ARDUINO_TO_ANDROID_gekuerzt.ino: In function 'void loop()':
ARDUINO_TO_ANDROID_gekuerzt:179: error: no matching function for call to 'REDFLY::socketSend(uint8_t&, int*, unsigned int, uint8_t [4], int)'
C:\...\arduino-1.0.2\libraries\RedFly/RedFly.h:120: note: candidates are: uint8_t REDFLY::socketSend(uint8_t, uint8_t*, uint16_t, uint8_t*, uint16_t)
C:\...\arduino-1.0.2\libraries\RedFly/RedFly.h:121: note:                 uint8_t REDFLY::socketSend(uint8_t, char*, uint8_t*, uint16_t)
C:\...\arduino-1.0.2\libraries\RedFly/RedFly.h:123: note:                 uint8_t REDFLY::socketSend(uint8_t, uint8_t*, uint16_t)
C:\...\arduino-1.0.2\libraries\RedFly/RedFly.h:124: note:                 uint8_t REDFLY::socketSend(uint8_t, char*)
C:\...\arduino-1.0.2\libraries\RedFly/RedFly.h:126: note:                 uint8_t REDFLY::socketSend(uint8_t, int)

MaFu

Code: [Select]
int bla = 1024;
char buffer[sizeof(bla)];        
sprintf(buffer,"%d",bla);
Serial.println("");
for(int i = 0; i < sizeof(bla); i++)
{
   Serial.print(buffer[i]);
}
Serial.println("");

Die Variable "bla" ist vom Typ "int" und somit genau 2 Byte groß.
Mit
Code: [Select]
char buffer[sizeof(bla)];
definierst Du somit ein Array mit zwei Stellen.
Code: [Select]
sprintf(buffer,"%d",bla);
benötigt 5 Stellen (wenn in "bla" 1024 steht). Du überschreibst damit drei Bytes im RAM die ev. anderweitig belegt sind.
Du solltest das Array einfach mit der maximalen Größe deklarieren, welche vorkommen kann. Bei einem 16 Bit Integer sind das fünf Stellen plus ev. Vorzeichen. Inklusive abschließendem Nullbyte sind das somit 7 Stellen.
_______
Manfred

Micke

unabhängig von der länge des buffers habe ich noch ein ganz anderes problem.
auf der Smartphone seinte gebe ich die empfangenen bytes wieder aus und erhalte
[B@414fb268   

will sagen ich krieg das ganze in java nicht wieder zurück gecastet

mkl0815

Die Bytes die Du bekommst sind nicht die Zahlen-Werte der einzelnen Stellen, sondern die ASCII-Werte der Zeichen.
Also ein (int)1024 wird nicht zu den Byte-Werten 1,0,2,4 sondern zu den Zeichen-Werten 49,48,50,52.

Außerdem darfst Du bei einem C-String nicht das terminierende '\0'-Byter vergessen.

Wenn Du einen Puffer mit 25 Zeichen definierst, wird der einfach aus dem Speicher "rausgebissen", der Inhalt aber nicht auf '0' gesetzt.
Wandelst Du nun den int-Wert 1024 per sprintf() in einen String um, werden da 5! (nicht 4) Zeichen draus. Nämlich { '1','0','2','4','\0'}. Das 5. Zeichen (0-Byte, nicht das Zeichen "0") sagt den entsprechenden C-Funktionen, das an diesem Zeichen der String zuende ist. Das Zeichen wird auch in der Regel nicht mit ausgegeben.
Damit kann hinter dem 5. Zeichen im Puffer immer noch Müll stehen, das interessiert dann nicht.

Das die Funktion
Code: [Select]
RedFly.socketSend(hUDP,&value,sizeof(value),ip,UDP_PORT);
Fehler wirft, liegt daran, das die Typen nicht passen. Das sollte sich durch geschicktes "Casten" aber regeln lassen. Leider kann ich das zur Zeit hier nicht testen.

Go Up