mikrocontroller.net

Forum: Compiler & IDEs PDU in ASCII wandeln


Autor: Bastian F. (bastian_f)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche mit der Funktion, die hier 
(Beitrag "Re: SMS im PDU Format entschlüsseln C-Code") gepostet wurde 
eine SMS im PDU Format umzuwandeln.
Momentan noch am Rechner, da geht das testen schneller, aber es soll auf 
einem AVR laufen, deswegen habe ich hier gepostet.

In einem Beitrag dort steht, dass die Daten als HEX Werte übergeben 
werden müssen, was ich auch probiert habe.
char sms[]={30,37,39,31,39,34,37,31,30,37,31,36,30,30,30,30,30,34,30,43,39,31,39,34,37,31,38,38,32,30,39,35,37,35,30,30,30,30,31,31,33,30,31,31,34,31,38,33,30,35,34,30,30,32,34,31,33,37};
strcpy(SMSBuffer,sms);
Außerdem habe ich probiert die SMS komplett zu kopieren.
strcpy(SMSBuffer,"0791947107160000040C91947188209575000011301141830540024137");
Beides hat nicht geklappt.

Es kommt immer sowas in der Art bei raus:
JyqDH<yAD<xbcJ)rC   <R<xxqya#DxpDH!J

Außerdem gibt mir der Compiler folgende Warnungen:
control reaches end of non-void function  main.c  /c_lokal  line 91 
C/C++ Problem
pointer targets in passing argument 1 of ‘strcpy’ differ in signedness 
main.c  /c_lokal  line 79  C/C++ Problem

Mit der Ersten kann ich nichts anfangen und bei der Zweiten ist es wohl 
so, dass sich unsigned und "nicht unsigned" in die Quere kommen, aber da 
weiß ich auch nicht, wie ich dies beheben kann.

Vielleicht kann jemand helfen, oder hat eine andere Funktion die mir die 
PDU SMS in Klartext umwandeln kann.
Danke,
Basti

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastian F. schrieb:
> Mit der Ersten kann ich nichts anfangen und bei der Zweiten ist es wohl
> so, dass sich unsigned und "nicht unsigned" in die Quere kommen, aber da
> weiß ich auch nicht, wie ich dies beheben kann.

Der erste Fehler bedeutet genau das was da steht: main() soll ein int 
zurückgeben, aber nirgends gibt es ein return, das auch ein int zurück 
gibt. Und das signed/unsigned Problem lässt sich auch trivial lösen, 
indem man beiden den selben Typ gibt.

Das erste offensichtliche, große Problem ist das strcpy(). Das kopiert C 
Strings, und die sind mit Null terminiert. Dein sms[] hört aber nicht 
mit einer Null auf, also kopiert das strcpy beliebig viel mehr und 
schreibt möglicherweise über das Ende von SMSBuffer raus.

Autor: Bastian F. (bastian_f)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok, habe es mal deinen Verbesserungen nach geändert (siehe Anhang), aber 
es kommt trotzdem nur Zeichensalat bei raus.

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Dekodierung stimmt auch nicht. Erst mal müssen die hexadezimal in 
ASCII geschriebenen Bytes in die direkte Binärform konvertiert werden. 
Also statt dem strcpy() eine Funktion, die immer zwei Zeichen zu einem 
Byte dekodiert.

Zweitens würde pdu2asci() auch unter den Umständen nicht stimmen — schon 
die Bitposition 0 nimmt nur die untersten 7 Bit des ersten Bytes, obwohl 
es (wenn ich PDU richtig verstanden haben) den Wert um eine Position 
nach rechts shiften müsste.

Mal eine ungetestete Funktion:
char getc_at_bitpos(char *buffer, unsigned int bit)
{
        uint16_t c;

        c = buffer[bit/8] << 8 | buffer[bit/8+1];
        bit = bit % 8;

        return c >> (9 - bit);
}

Diese Funktion aufgerufen für jede Bitposition im Puffer (also in dem 
Fall immer +7 mit jedem Schritt) sollte dann jedes Zeichen ergeben.

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, das achte Bit muss freilich gelöscht werden:
return (c >> (9 - bit)) & 0x7f;

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal Unsinn, die Bits werden doch von unten rein geschoben, also 
passt meine Funktion nicht.

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.