Forum: PC-Programmierung Arduino IR + MTTQ


von Till (Gast)


Lesenswert?

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! :)

von Tom (Gast)


Lesenswert?

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.

von Planlos (Gast)


Lesenswert?

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'.

von Till (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.