mikrocontroller.net

Forum: PC-Programmierung Arduino IR + MTTQ


Autor: Till (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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! :)

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte in C-Code-Tags.
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
}

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:
String msgString = "0xE0E0D02F"
Serial.println("Payload: " + msgString);
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.

Autor: Planlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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'.

Autor: Till (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.