UART Probleme

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 28 11 2024  06:13:19      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( Vorherige Seite 1 | 2 | 3 | 4 Nächste Seite )      


Autor
UART Probleme

    







BID = 530525

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika
 

  


Moin,

Habe mir den Code nur einmal angeschaut, aber nicht auf Logik geprüft, vieeeeeeeeel zu umständlich.


Zitat :

Ich werde erst später den Code ausprobieren können.

Dann, entschuldigung, teste ihn doch erstmal, bevor du hier postest. Ich gebe mir auch mühe, funktionierenden Kode zu posten. Außerdem solltest du meine Hilfestellung ernst nehmen, oder es selber machen. Nicht umsonst schrieb ich

Zitat :

Bitte nicht vom String der einzelnen Bits ausgehen. Das wäre zwar möglich, aber blödsinnig .

und lieferte schon einen Prototypen

Zitat :

uint8_t *hex8(uint8_t number, uint8_t *dest);


Wozu mache ich mir die Mühe, wenn die Ratschläge in den Wind geblasen werden?


Also, nochmal etwas netter:
die Zahlen 0-9 entsprechen auch den Zahlen 0x0-0x9, die Zahlen 10-15 entsprechen 0xA-0xF. Das tolle ist, dass also ein Zeichen (0-F) genau vier Bits repräsentiert. Also, die unteren vier Bits entsprechen einem Zeichen, die oberen vier dem anderen.

Und wir müssen darauf achten, dass darstellbare Zeichen (ASCII) dabei rauskommen. Ich mache das jetzt hier mal für das untere Nibble, du machst das höhere.

uint8_t Wert, Temp;
uint8_t Puffer[3]; /* danach fragte ich, wurde auch überlesen...*/

Puffer[0]=Puffer[1]='0'; /* mit ASCII 0 füllen */
Puffer[2]=0;

Temp=Wert & 0xF;

if(Temp < 0xA)
Puffer[1]=Temp + '0';
else
Puffer[1]=Temp + 'A' - 10;

/* und schon haben wir als Zeichen in Puffer[1] irgendwas zwischen 0-9 ^ A-F stehen.*/

Jetzt zum Lernen: versuche mal, mein Programm zu kommentieren. Benutze dazu am besten eine Tabelle mit ASCII-Zeichen. Bitte alles kommentieren, v.a., warum grade das gemacht wurde, wie es dort steht!

Das kann man auch, um später auch mehr als nur zwei Nibbles zu verarbeiten sehr stark auf diese Funktion verkürzen:

char hexval(unsigned char arg)
{
return ((arg&=0xF)<0x0A) ? (arg+'0') : (arg+'A'-10);
};

Sie gibt als Wert immer das ASCII-Zeichen der unteren vier Bits zurück. Das kann man iterativ sehr gut auf beliebig lange (rein theoretisch) Bytes anwenden.



Edit:

Zitat :

*hex='F';

*hex++;

*hex='F'; ist ja ok, aber was passiert in der nächsten Zeile? Du inkrementierst den Wert, nicht den Zeiger. Der Zeiger würde also weiterhin auf den gleichen Bereich zeigen, aber dort würde kein 'F' mehr stehen sondern ein 'G' .



_________________


[ Diese Nachricht wurde geändert von: DonComi am 25 Jun 2008 17:43 ]

BID = 530588

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

 

  

Für mich ist es einfach als purer Einsteiger ganz schwer gleich solche Funktionen zu programmieren.

So ich probiere einmal deinen CODE zu kommentieren:

uint8_t Wert, Temp; //deklaration WERT und TEMP in int
uint8_t Puffer[3]; // int feld mit 3 werten

Puffer[0]=Puffer[1]='0'; //Alle werte auf 0 setzen
Puffer[2]=0;

Temp=Wert & 0xF; //Temp wird mit 1111 verundet

if(Temp < 0xA) // Wenn der wert kleiner wie A ist dann
Puffer[1]=Temp + '0'; // der wert Temp wird auf Puffer[1] geschrieben
else //ansonsten
Puffer[1]=Temp + 'A' - 10; //wird A zu Temp in Puffer geschrieben und der
//wert um 10 reduziert

Mfg
Rambodischien

[ Diese Nachricht wurde geändert von: Rambodischien am 25 Jun 2008 21:10 ]

BID = 530590

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Ja, recht gut, aber nicht immer so präzise.

Und jetzt schreibst du das ganze auf zwei Nibbles, also ein Byte um - Fertig.

_________________

BID = 530593

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

OK ich probier es:



Code :



uint8_t Wert, Temp;
uint8_t Puffer[3];

Puffer[0]=Puffer[1]='0';
Puffer[2]=0;

Temp=Wert & 0xF;

if(Temp < 0xA)
Puffer[1]=Temp + '0';
else //ansonsten
Puffer[1]=Temp + 'A' - 10;

Temp=Wert & 0xF0;

if(Temp <0xA0)
Puffer[2]=Temp +'0';
else
Puffer[2]=Temp+'A'-10;




Mfg
Rambodischien

BID = 531718

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo Rambodieschen

Das sieht doch schonmal ganz gut aus, nur ist da noch ein logischer Fehler:


Zitat :

Temp=Wert & 0xF0;



if(Temp <0xA0)

Puffer[2]=Temp +'0';

else

Puffer[2]=Temp+'A'-10;


Du verundest Temp mit 0xF0, dabei kommt entweder 0 raus oder aber eine Zahl, die größer als 15 ist. Da darfst du jetzt aber keinen Offset mehr dazuaddieren, denn dann stimmen die ASCII-Zeichen nicht mehr.
Um das zu vermeiden, solltest du die Nibbles einfach tauschen oder den Wert durch 16 teilen oder alle Bits um vier Stellen zum LSB schieben. Daher wiederholt sich obiger Vorgang:

/* Code */
Temp=(Wert>>4) & 0x0F;

if(Temp <0xA)

Puffer[2]=Temp +'0';

else

Puffer[2]=Temp+'A'-10;
//Code

Du siehts, der Algorithmus ist sehr einfach. Man kann ihn eben noch so erweitern, dass man, wie ich das oben schon angedeutet habe, die Ermittlung des ASCII-Zeichens für das jeweils untere Nibble in eine Unterfunktion (static) packt. Man kann so nun weitere, darauf aufbauende Funktionen schreiben. Es wird dadurch möglich, quasi jeden Datentypinhalt hexadezimal darzustellen, ohne dass man den eigentlichen Algorithmus für jeden Typ neuschreibt.

Also, hiermal eine einfache, fertige Funktion, die die übergebene 8-Bit-Ganzzahl hexadezimal in den Puffer schreibt.


/* Code */
static uint8_t hexval(uint8_t arg)
{
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
};

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
*Strdest=hexval(value>>4);
*(Strdest+1)=hexval(value);
*(Strdest+2)=0;
return Strdest;
};
//Code

Mein C-Compiler für meine CPU in diesem Rechner benötigt für hexval(...) exakt 11 Maschieneninstruktionen resp. 23 Byte und für *hex8(...) 17 Maschieneninstruktionen bzw. 44 Byte.
Der C-Compiler für den AVR benötigt 8 Instruktionen bzw. 16 Byte und für die zweite Funktion 20 Instruktionen bzw. 40 Byte.
Würde man es selbst in ASM schreiben könnte man hier und da noch etwas Platz sparen. Alles in allem aber recht schonend .

/* Disassemblierung avr-gcc */


Code :


00000542 <hexval>:
542: 8f 70 andi r24, 0x0F ; 15
544: 8a 30 cpi r24, 0x0A ; 10
546: 10 f4 brcc .+4 ; 0x54c
548: 80 5d subi r24, 0xD0 ; 208
54a: 01 c0 rjmp .+2 ; 0x54e
54c: 89 5c subi r24, 0xC9 ; 201
54e: 99 27 eor r25, r25
550: 08 95 ret

00000552 <hex8>:
552: ff 92 push r15
554: 0f 93 push r16
556: 1f 93 push r17
558: f8 2e mov r15, r24
55a: 8b 01 movw r16, r22
55c: 82 95 swap r24
55e: 8f 70 andi r24, 0x0F ; 15
560: f0 df rcall .-32 ; 0x542
562: f8 01 movw r30, r16
564: 80 83 st Z, r24
566: 8f 2d mov r24, r15
568: ec df rcall .-40 ; 0x542
56a: f8 01 movw r30, r16
56c: 81 83 std Z+1, r24 ; 0x01
56e: 12 82 std Z+2, r1 ; 0x02
570: c8 01 movw r24, r16
572: 1f 91 pop r17
574: 0f 91 pop r16
576: ff 90 pop r15
578: 08 95 ret



/* Disassemblierung gcc für x86 */


Code :


static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret
[/code1]xf,%eax
8048366: 3c 09 cmp [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret
[/code1]x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret
[/code1]x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret
[/code1]x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret
[/code1]xf,%eax
8048366: 3c 09 cmp [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret
[/code1]x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret
[/code1]x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret


08048377 <hex8>:

uint8_t *hex8(uint8_t value, uint8_t *Strdest)
{
8048377: 55 push %ebp
8048378: 89 e5 mov %esp,%ebp
804837a: 53 push %ebx
804837b: 8b 5d 0c mov 0xc(%ebp),%ebx
*Strdest=hexval(value>>4);
804837e: 8a 45 08 mov 0x8(%ebp),%al
8048381: c0 e8 04 shr [1code]
static uint8_t hexval(uint8_t arg)
{
8048360: 55 push %ebp
8048361: 89 e5 mov %esp,%ebp
return ((arg&=0xF) < 0xA) ? (arg+'0') : (arg+'A'-0xA);
8048363: 83 e0 0f and $0xf,%eax
8048366: 3c 09 cmp $0x9,%al
8048368: 77 05 ja 804836f <hexval+0xf>
804836a: 83 c0 30 add $0x30,%eax
804836d: eb 03 jmp 8048372 <hexval+0x12>
804836f: 83 c0 37 add $0x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret
[/code1]x37,%eax
8048372: 0f b6 c0 movzbl %al,%eax
};
8048375: 5d pop %ebp
8048376: c3 ret




_________________


[ Diese Nachricht wurde geändert von: DonComi am  1 Jul 2008 10:09 ]

BID = 531816

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Vielen Dank für die ausführliche und gute Erklärung.

Ich glaube das habe ich kapiert und ich werde in der nächsten Zeit den Code ausprobieren.

Leider habe ich wieder ein paar Probleme.

1) Ich wollte die Größe des Feldes mit einem Modulo verknüpfen:

etwa so: while(sizeof(puffer)%8 != 0)

(Puffer ist ein Pointer auf ein Feld)

Nur leider funktioniert das nicht.

2)Wie kann ich ein char[] einfach umdrehen? Das heißt einfach dass das letzte Zeichen als erstes steht, das zweitletzte als zweites Zeichen usw. gibt es dafür irgendwelche Funktionen.

Danke

Mfg
Rambodischien

BID = 531839

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Zitat :


1) Ich wollte die Größe des Feldes mit einem Modulo verknüpfen:

etwa so: while(sizeof(puffer)%8 != 0)

(Puffer ist ein Pointer auf ein Feld)


sizeof ist statisch, d.h. es wird nicht zur Laufzeit bestimmt, wie groß das Objekt ist.

Es ginge aber so:

uint8_t Feld[100];

sizeof Feld /* Ergebnis: 100 */

Das Ganze klappt nichtmehr, wenn ein Zeiger, der auf den Anfang eines Arrays zeigt,als Argument an sizeof übergeben wird!

Das erläutert dieses Beispiel:
uint8_t Feld[100];
uint8_t *feld = &Feld[0];

sizeof Feld: 100
sizeof feld: 2!

Außerdem macht es keinen Sinn, da sich wie gesagt sizeof statisch verhält und sich im Programm nie ändern würde. Der Compiler würde den Audruck sizeof(puffer)%8 zuende ausrechnen und ggf. die while-Bedingung als erfüllt bzw. unerfüllt erkennen und ggf. wegoptimieren.

2.
In der C-Library bin ich grade nicht fündig geworden, aber das dürfte mit deinem Kenntnisstand bereits selbst implementierbar sein .
Oder du googelst mal nach strreverse oder ähnliches.


_________________

BID = 531965

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Danke für die schnelle Antwort.

Noch eine Frage:

wenn ich in einem char[] 11000010100100010101 stehen habe möchte ich die ersten 4 Zeichen in ein Integerwert umwandeln damit ich nachher es in eine hex-Zahl umwandeln kann.

Wie mache ich so etwas?

Ich habe mir überlegt das ich wenn ich z.B.: 1010 habe von hinten nach vorne durchgehe und wenn ich an der zweiten stelle einen 1er habe den Integerwert +2 mache und wenn ich an der vierten Stelle einen 1er habe ich den Wert +8 rechne.

Gibt es hier eine bessere Lösung?

Mfg
Rambodischien

BID = 532068

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Der Ansatz ist doch gut.
OK, ich hoffe, du willst nicht erst eine Zahl in einen Binärstring umrechnen lassen und diesen wieder in einen Hexstring.

Zum Thema:
Jetzt verfolge doch mal deinen Plan und implementiere ihn! Nur so lernt man auch, es muss nicht immer gleich von Anfang alles so perfekt sein.

Die Wertigkeiten sind ja klar: 1, 2, 4, 8.
Das kann man sehr vielfältig und gewitzt machen. Mach mal nen Vorschlag, ich bewerte ihn dann.

_________________

BID = 532074

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich


Zitat :
DonComi hat am  2 Jul 2008 19:00 geschrieben :

Der Ansatz ist doch gut.
OK, ich hoffe, du willst nicht erst eine Zahl in einen Binärstring umrechnen lassen und diesen wieder in einen Hexstring.



Genau das ist meine Absicht

Nun etwas genauer: Ich will eine SMS versenden über ein Handy dazu benötige ich den PDU-Mode.

Der Text der versendet werden soll muss folgendermaßen konstruiert werden.

Ein Ascii Zeichen hat 7 Bit und damit das 8te Bit nicht verschwendet wird wird vom nächsten Zeichen das Bit in die 8 Bit mit hinein genommen.

Und ich will das in C Programmieren.

Mfg
Rambodischien

BID = 532076

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Zitat :

Ein Ascii Zeichen hat 7 Bit und damit das 8te Bit nicht verschwendet wird wird vom nächsten Zeichen das Bit in die 8 Bit mit hinein genommen.

Und ich will das in C Programmieren.


Aber doch nicht über einen solchen Klimmzug.
Da eignen sich diverse Operationen auf Bitebene besser - vorallem wesentlich schneller.

Ansonsten, meine Antwort steht ja im vorigen Posting.

_________________

BID = 532085

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich


Zitat :
DonComi hat am  2 Jul 2008 19:34 geschrieben :


Aber doch nicht über einen solchen Klimmzug.
Da eignen sich diverse Operationen auf Bitebene besser - vorallem wesentlich schneller.



Wie?

Trotzdem habe ich probiert was zu schreiben leider bekomme ich immer eine 0 zurück.



Code :



while(*strret)
{

for(i=0;i<4;i++)
{

if((strret+(y+i))==1)
{
if(i==3)
{
hex=hex+1;
}
else
{
hex=hex+0;
}
if(i==2)
{
hex=hex+2;
}
else
{
hex=hex+0;
}
if(i==1)
{
hex=hex+4;
}
else
{
hex=hex+0;
}
if(i==0)
{
hex=hex+8;
}
else
{
hex=hex+0;
}
}
else
{
hex=hex+0;
}

}

y=y+4;
strret=strret+4;
};




strret ist ein Pointer auf das Feld mit den 0er und 1er.

Mfg
Rambodischien

BID = 532135

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo,


Zitat :
hex=hex+0;

Das ist sinnfrei und braucht demnach auch nicht implementiert zu werden.


Zitat :
if((strret+(y+i))==1)


Abgesehen davon, dass ich keine Ahnung habe, was y ist (keine Definition -> existiert für mich nicht ), wird der Inhalt des Strings nie 1, sondern höchstens '1'.
Du musst unterscheiden zwischen dem ASCII-Zahlenwert von dem Zeichen 1 und der Zahl 1!
Außerdem arbeitest du hier ja nicht mit dem Wert von strret, sondern mit dem Zeiger!

Die Klammerung ist auch überflüssig, da dort eine Summe gebildet wird.

Und wenn du schon iterierst, dann auch so, dass du nicht i tausendmal neu testen muss, das braucht alles Rechen- und Speicherresourcen. Entweder lässt sich der Iterator in den Algorithmus miteinbeziehen oder er dient nur dazu, einen Vorgang definiert oft abzuspielen.

Hier mal meine Version:
(achja, poste doch bitte den ganzen Quelltext bzw. zumindest die ganze Funktion, ist einfacher für mich, als nur einen Kodebrocken zu haben ):

uint8_t nibble_hex(uint8_t *quellstring);



uint8_t nibble_hex(uint8_t *quellstring)
{

    uint8_t i, ret=0;

    for (i=0;i<4;i++, quellstring++)

      ret += (*quellstring-'0')<<i;

    return ret;

};


Anstelle von
ret += (*quellstring-'0')<<i

kann man auch schreiben:

if(*quellstring=='1')

    ret += 1<<i;


Da i von 0 bis 3 hochgezählt wird, wird jedesmal die Stellenwertigkeit des Summanden geändert. Sie beginnt bei 1, dann 2, 4 und 8 (1<<0 -> 1; 1<<1 -> 10b; 1<<2 -> 100b; 1<<3 -> 1000b)

Das hat den Vorteil, dass, wenn nicht sichergestellt ist, dass im String nur '0' und '1' vorkommt, das Programm nicht irgendeinen S***** macht. Im ersten Fall gehts nur gut, solange auch wirklich nur '1'en und '0'en sind. Ist dort ein anderes Zeichen, z.B. eine Terminierung, dann wird dort eine ganz andere Zahl stehen. Nimm also, wenn es sicherer sein soll, den letzen Vorschlag.
Außerdem sollte man testen, ob nicht eventuell der String schon zuende ist und man nicht im Nirvana ließt...

Daher wäre es sinnvoll, ja sogar für guten Stil zwingend, die for-Schleife so zu erweitern:

for (i=0;(i<4) && *quellstring ;i++, quellstring++)

    ...;


Alles klar?
Dann kommentier mal meinen (kompletten) Kode aus! Dabei sollte man ürbigens nur Sachen kommentieren, die sich nicht selbst erklären. Also pointer++; ist klar, dass wird nicht kommentiert.

Was mir so aufgefallen ist bei dir:

    * du vergisst manchmal, dass Pointer und Wert, auf den der Pointer zeigt, zwei unterschiedliche Dinge sind. Auf den Wert wird zugegriffen, wenn man den Pointer dereferenziert, und zwar eben mit dem *-Operator. Das hast du aber schon zum größten Teil alles richtig gemacht
    * du bringt die Werte 1 und 0 und '1' und '0' manchmal durcheinander. '1' ist eine Zahl, im ASCII-Kode 49, '0' ist dort 48. Das muss unterschieden werden.
    Hier als kleine Hilfe eine ASCII-Tabelle:
    http://de.wikipedia.org/wiki/ASCII-Tabelle


Gut, soweit erstmal

Edit: achja, ich vergas. Es wird nur eine Zahl zwischen 0 und 15 errechnet. Wenn du ein Zeichen des Hexadezimalkodes zurückgeben willst, greife einfach auf die bereits bekannte kurze Funktion zurück.
static uint8_t hexval(uint8_t arg);

also, return hexval(ret);



_________________


[ Diese Nachricht wurde geändert von: DonComi am  3 Jul 2008  2:04 ]

BID = 532803

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Bin gerade dabei das Programm zu schreiben, aber leider habe ich wieder ein Problem:

Ich versuchen von dem char[] ( in dem 0010010 steht) in ein Integerwert umzuwandeln, das funktionier aber leider nicht. Ich habe es mit atoi probiert aber leider kommt immer 0 herraus.

Wenn ich das komplette Feld mit atoi(string) probiere kommt eine art hexcode heraus. Wenn ich nur atoi(string[1]) mache kommt immer 0 heraus egal was ich auch eingeben.

Mfg
Rambodischien

BID = 532943

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Och, komm schon.
atoi würde daraus eine entsprechend große Zahl machen, aber 8 Bit reichen nicht aus. ato geht ja auch von einer Basis 10 und nicht aus.

Das sind doch alles Fingerübungen. Dir sind die Stellenwertigkeiten der Bits bekannt. Teste acht mal auf '1', wenn es zutrifft addierst du die Stellenwertigkeit auf. Die Summe entspricht dann der Zahl.


_________________


Vorherige Seite       Nächste Seite
Gehe zu Seite ( Vorherige Seite 1 | 2 | 3 | 4 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 0 Beiträge verfasst
© x sparkkelsputz        Besucher : 182415982   Heute : 479    Gestern : 7490    Online : 308        28.11.2024    6:13
0 Besucher in den letzten 60 Sekunden         ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0772562026978