Hallo zusammen, ich stehe gerade vor einem Problem, zu dem ich einfach keine Lösung finde: In meinem Schlafzimmer befindet sich ein Arduino, der mittels MTTQ Client IR Codes empfangen soll und diese dann mit der IRemote Libary senden soll. Die Verbindung von MTTQ zum Arduino funktioniert. Ich erhalte auch die korretkten Befehle auf dem Arduino (Als String). Nun zu dem Problem: Mit dem Befehl irsend.sendNEC möchte ich z.B. am TV die Lautstärke verringern. Schreibe ich den IR Code "0xE0E0D02F" hardcoded, funktioniert das Ganze: irsend.sendNEC(0xE0E0D02F, 32); Hier die Function: void callback(char* topic, byte* payload, unsigned int length) { // Zähler int i = 0; // Hilfsvariablen für die Convertierung der Nachricht in ein String char message_buff[100]; Serial.println("Message arrived: topic: " + String(topic)); Serial.println("Length: " + String(length,DEC)); // Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0 for(i=0; i<length; i++) { message_buff[i] = payload[i]; } message_buff[i] = '\0'; // Konvertierung der nachricht in ein String String msgString = String(message_buff); Serial.println("Payload: " + msgString); irsend.sendNEC(msgString.toInt(),32); //Bsp: 0xE0E0D02F } Wieso funktioniert die Konvertierung nicht aber wenn ich den Code direkt eingebe schon? Vielen Dank für Eure Hilfe! :)
Bitte in C-Code-Tags.
1 | void callback(char* topic, byte* payload, unsigned int length) { |
2 | // Zähler
|
3 | int i = 0; |
4 | // Hilfsvariablen für die Convertierung der Nachricht in ein String
|
5 | char message_buff[100]; |
6 | |
7 | Serial.println("Message arrived: topic: " + String(topic)); |
8 | Serial.println("Length: " + String(length,DEC)); |
9 | |
10 | // Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0
|
11 | for(i=0; i<length; i++) { |
12 | message_buff[i] = payload[i]; |
13 | }
|
14 | message_buff[i] = '\0'; |
15 | |
16 | // Konvertierung der nachricht in ein String
|
17 | String msgString = String(message_buff); |
18 | Serial.println("Payload: " + msgString); |
19 | |
20 | irsend.sendNEC(msgString.toInt(),32); //Bsp: 0xE0E0D02F |
21 | }
|
An welche Stelle des Arrays wird das letzte Byte geschrieben? Wohin wird \0 geschrieben? Weiterhin: Fehler isolieren. Passt der konvertierte String noch? Oder geht vorher etwas schief? Was passiert bei:
1 | String msgString = "0xE0E0D02F" |
2 | Serial.println("Payload: " + msgString); |
3 | irsend.sendNEC(msgString.toInt(),32); //Bsp: 0xE0E0D02F |
Was soll passieren, wenn (warum auch immer) length mal >= 100 ist? Nachtrag: nochmal Nachgesehen (im Source-Code, die Arduino-Doku von toInt() ist ein Witz). toInt benutzt nur atol(), und das verträgt nur dezimale Zahlen.
Till schrieb: > irsend.sendNEC(msgString.toInt(),32); //Bsp: 0xE0E0D02F Arduino String::toInt ist m.W. direkt auf "atol" gemappt, das kann nur Base10, bricht beim 'x' ab und konvertiert nur das erste Zeichen, '0'.
Hallo, danke erstmal für die Antworten! Ich habe das Problem jetzt auf anderem Weg gelöst. Ich habe mir die IR Codes direkt als Integer ausgeben lassen und diese dann mittels .toInt konvertiert. Vielleicht nicht die eleganteste Lösung aber die Performance und Stabilität stimmt. Die Arraylänge ist mir auch schon aufgefallen, habe ich jedoch nicht weiter beachtet, da die Codes nicht so lang sind - Die meisten Teile des Codes stammen aus einem Tutorial, die ich nur an meine Bedürfnisse angepasst habe. Wie auch immer vielen Dank für die Hilfe!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.