Hallo,
mein Arduino empfängt alle 500ms ein Datenpaket mit einer Zahl darin,
dieses wird in ein char Array gespeichert und zu einem MD5 hash gehasht.
Danach wird an den Hash noch 456 (ID) dran gehängt.
Funktioniert alles problemlos, jedenfalls 1-2 Minuten. Danach stoppt die
Serielle Kommunikation des Arduinos einfach. Die LED-leuchtet nicht
mehr, durch die Arduino IDE kommt nichts mehr an und auch nicht in
Putty. Komisch ist wenn ich das serielle Fenster in der Arduino IDE
beende und danach wieder öffne klappt die Ausgabe wieder für 1-2
Minuten. Bin echt ratlos..
Baudrate wurde mit 9600 und 115200 versucht.
1
#include<MD5.h>
2
#include<SPI.h>
3
#include<Ethernet.h>
4
#include<EthernetUdp.h>
5
6
7
8
9
intudppacket=0;
10
intarraygroesse=0;
11
intclientarraygroesse=0;
12
bytesendestatus=0;
13
bytehashzaehler=0;
14
unsignedlongclientzeit=0;
15
16
17
18
charrecieveddata[100];
19
charhasharray[100];//Ein MD5 Hash hat 32 Zeichen, hier von 0-31, die Zeichen 32-34 dient zur Zuordnung des Hashes, die restlichen fuer die Clientzeit
20
charclientzeitbuffer[100];
21
22
23
//Lokale Adresse:
24
25
byteclientmac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xEB};
26
IPAddressclientip(192,168,3,2);
27
IPAddressclientsubnet(255,255,255,0);
28
IPAddressgateway(192,168,3,1);
29
intclientport=8002;//Lokaler Port
30
31
//Serveradresse:
32
33
IPAddressserverip(192,168,3,1);//Address to send UDP packe to
34
IPAddressservergateway(292,168,3,1);
35
intserverport=8001;
36
37
38
charpacketbuffer[UDP_TX_PACKET_MAX_SIZE];//Bufferspeicher um Empfangene Pakete bis zur Bearbeitung zu speichern.
Ich hab das Gefuehl, die serielle Schnittstelle ist blockierend. Dann
wird sie mit viel zuviel Zeug zugemuellt.
Zu Beginn wuerd ich nur das UDP Packet byte fuer byte auf die Serielle
kopieren, ohne zusaetzliches Zeug.
> könntest du das genauer erklären?
Der Funktionsaufruf in besagter Zeile allokiert Ressourcen (hier:
Speicher), die Du nie wieder freigibst (hier: das zugehörige
free(md5str) fehlt) -> nach ein paar Runden ist die Ressource
aufgebraucht (hier: kein freier Speicher mehr verfügbar) und es
passieren lustige Sachen.
Paul schrieb:> Danke für diese Antwort aber damit kann ich eigentlich gar nichts> anfangen.
Zu jedem malloc gehört ein passendes free (siehe Grundlagen dynamischer
Speicherverwaltung im Buch Deiner Wahl). Also in den Quelltext von
MD5::make_hash und MD5::make_digest sehen, ob dort ein malloc passiert.
Der Autor der MD5-Lib hätte auch die C++-Möglichkeiten nutzen können
(RAII), statt eine Klasse als überflüssigen Behälter für simple C-artige
Funktionen zu verwenden.
Hallo,
nun habe ich ein weiteres Problem, der Hash wird erstellt jedoch stimmt
dieser nur teilweise überein.. wäre toll wenn mir wieder jemand einen
Tipp geben könnte. Das Array welches an die Hashfunktion gegeben wird
enthält den richtigen Inhalt, auch der generierte Hash stimmt, jedoch
fehlen unterscheiden sich die Hashes:
z.B.
Klartext: 7377913
Arduino-Hash
1a6363927d7bfc6ff1cbd7048760d57378914
Normal generierter Hash
691a6363927d7bfc6ff1cbd7048760d5
Jemand eine Ahnung?
1
#include<MD5.h>
2
#include<SPI.h>
3
#include<Ethernet.h>
4
#include<EthernetUdp.h>
5
6
7
intudppacket=0;
8
intarraygroesse=0;
9
intclientarraygroesse=0;
10
bytesendestatus=0;
11
bytehashzaehler=0;
12
unsignedlongclientzeit=0;
13
14
15
16
charrecieveddata[100];
17
charhasharray[100];//Ein MD5 Hash hat 32 Zeichen, hier von 0-31, die Zeichen 32-34 dient zur Zuordnung des Hashes, die restlichen fuer die Clientzeit
18
charclientzeitbuffer[100];
19
20
21
//Lokale Adresse:
22
23
byteclientmac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xEB};
24
IPAddressclientip(192,168,3,2);
25
IPAddressclientsubnet(255,255,255,0);
26
IPAddressgateway(192,168,3,1);
27
intclientport=8002;//Lokaler Port
28
29
//Serveradresse:
30
31
IPAddressserverip(192,168,3,1);//Address to send UDP packe to
32
IPAddressservergateway(292,168,3,1);
33
intserverport=8001;
34
35
36
charpacketbuffer[UDP_TX_PACKET_MAX_SIZE];//Bufferspeicher um Empfangene Pakete bis zur Bearbeitung zu speichern.
Paul schrieb:> free(md5str);>> for (int i = 0; i < 32; i++) {> Serial.print(md5str[i]);
du darfst nicht den Speicher freigeben und dann später wieder darauf
zugreifen.
Ich würde das Programm so umschreiben, das man überhaupt keine
dynamischen Speicher braucht, lege doch das hash objekt global an. Das
kann auch mehrfacher verwendet werden.
Keine Ahnung wie Arduino reagiert, wenn kein Speicher mehr frei ist bzw.
wenn er zu stark fragmentiert ist.
Vielen Dank, du hast mir sehr geholfen!
Ja ich habe jetzt md5str vor der Speicherfreigabe in ein neues char
Array geschrieben und jetzt klappt es... :)
Paul schrieb:> Ja ich habe jetzt md5str vor der Speicherfreigabe in ein neues char> Array geschrieben und jetzt klappt es... :)
und warum? hast du zu viel ram oder cpu zeit das du sinnlos zeug
rumkopieren musst?
Kannst du es nicht gleich in eine Variabel schreiben lassen?