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: 24 11 2024  12:35:53      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 = 527573

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika
 

  


Dazu legst du weitere Speicherfelder an.
Du kannst auch mehrdimensionale Arrays nutzen. Aber die Frage ist halt, wieviel du so speichern willst: bedenke, der Puffer belegt schon fixe 100 Byte, aus diesem Puffer musst du mit Rechenaufwand die Daten in die anderen Arrays umkopieren und du musst sichergehen, dass genügend SRAM für den Stack freibleibt.

Es muss einen anderen Weg geben, aber so haust du dir die Reserven schnell weg.

Kopieren mit Zeiger ist einfach.
Erst legst du Felder an und lässt einen Zeiger an dessen Start zeigen:
unsigned char reservierterSpeicher[GROESSE];
unsigned char *p_Speicher = &reservierterSpeicher[0];

Du hast außerdem noch den Zeiger, der auf die Daten im Puffer zeigt.

Mit der Dereferenzierung kannst du Inhalte leicht kopieren:

*p_Speicher = *empfangen

Danach werden beide Zeiger inkrementiert
p_Speicher++ und empfangen++;

und der Spaß geht von vorn los, bis ein \\0 erwischt wird.

for(p_Speicher = &reservierterSpeicher[0]; *empfangen; empfangen++, p_Speicher++)
*p_Speicher = *empfangen;

Jetzt deutete ich schon an, dass es mehrdimensionale Arrays gibt.

_________________

BID = 527575

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

 

  

Vielen Dank erstmal ich werde mich morgen drum kümmern.


Zitat :

Jetzt deutete ich schon an, dass es mehrdimensionale Arrays gibt.


Ich lerne mehr und mehr dazu, finde ich nicht schlecht

Jetzt geht es feiern: Österreich, Österreich

Mfg
Rambodischien

BID = 528608

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Super hat alles geklappt

Jetzt habe ich aber eine weitere Frage:

Wie schaffe ich es ein char in ein binäres Format umzuwandeln danach die binäre Zeichen zusammenhängen?

Gibt es dazu irgendwelche Funktionen?

Mfg
Rambodischien

BID = 528615

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Zitat :
Wie schaffe ich es ein char in ein binäres Format umzuwandeln danach die binäre Zeichen zusammenhängen?

Wie meinst du das? Auch hier scheitert eine prompte Antwort an der Ungenauigkeit der Fragestellung .

Ein Char (signiertes Byte) wird permanent binär behandelt... Oder willst du wirklich eine Zeichenkette bekommen, in der man die Bitkombination einer vorzeichenbehafteten (char eben...) 8-Bit-Zahl sieht?

Ich glaub eher weniger...

Schildere bitte genau, was du meinst und was du unter "binärem Zeichen" verstehst.

_________________

BID = 528636

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Ich meinte damit, dass ich aus z.B.: Dem Wort "Hallo" die Bits erhalte z.B.: 0010001010101010101010 usw.

Mfg
Rambodischien

BID = 528644

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Habe im Netz gerade was gefunden nur leider weiß ich nicht wie das ganze von statten geht:



Code :


std::cout << std::bitset<CHAR_BIT>( 'K' )
<< std::endl;



Ich habe keine Ahnung wo ich was eingeben muss.

Mfg
Rambodischien

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

BID = 528656

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Nenene,

Das, was du da hast, sind Teile der Standardbibliothek von C++. Das geht in C so überhaupt nicht.

---

Das geht in C manuell sogar ziemlich einfach.



Geh doch mal systematisch ans Problem:
1. Es soll ein nullterminierter String in seine Einzelbytes zerlegt werden
2. jedes dieser Einzelbytes soll in seine zugrundeliegende Bitkombination zerlegt werden
3. Es erfolgt eine Ausgabe in einen Zielstring, also einen Speicherbereich.

Jetzt die Rahmenbedingungen aufschreiben:
1. Aufteilung entweder mit indirekter Adressierung über die []-Referenzierung und einen Iterator oder aber direkt über Inkrementieren des Quellstrings
2. Ein Char packt 8 Bits, das sind 8 Bytes, die für '0' oder '1' reserviert werden müssen. Weiterhin muss eine Funktion her, die das umrechnet. Dazu empfielt sich das "verunden" mit 1 und das 8-fache Schieben nach rechts, dann hat man das Ergebnis
3. Der Zielstring muss wie groß sein, damit der String als Binärzahl ausgegeben werden kann?

---
Dann definiert man einen Funktionsprototypen. Du kannst ja mal hier hinschreiben, wie der aussehen würde.
Bedenke, welche Argumente und Rückgabewerte der sinnigerweise haben sollte .

Ich helfe dir weiter, aber jetzt sollst du mal ein bischen mitdenken .

_________________

BID = 528661

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich


Zitat :
DonComi hat am 17 Jun 2008 22:03 geschrieben :


Ich helfe dir weiter, aber jetzt sollst du mal ein bischen mitdenken .



Also gut ich versuche es:



Code :


char Text[]="Das ist ein Test""[1code]
char Text[]="Das ist ein Test""\0";
char Ausgabe[(Text.length)*8]
int i=0;
int x=0;

while(Text[i]!='\0')
{
for(x=0;x<8;x++)
{
Ausgabe[x]=(Text[i]& 1)>>x;
}
i++;
}

[/code1]";
char Ausgabe[(Text.length)*8]
int i=0;
int x=0;

while(Text[i]!='[1code]
char Text[]="Das ist ein Test""\0";
char Ausgabe[(Text.length)*8]
int i=0;
int x=0;

while(Text[i]!='\0')
{
for(x=0;x<8;x++)
{
Ausgabe[x]=(Text[i]& 1)>>x;
}
i++;
}

[/code1]')
{
for(x=0;x<8;x++)
{
Ausgabe[x]=(Text[i]& 1)>>x;
}
i++;
}




So in etwas?

Mfg
Rambodischien

BID = 528675

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Zitat :
So in etwas?


Geht es denn so bei dir?



Zitat :
char Ausgabe[(Text.length)*8]

Dass man die Größe des Zielpuffers 8 mal so groß wählt wie die Eingabedaten ist, sinnigerweise, richtig.
Aber so wird das nicht klappen, was soll das lenght? Wenn dann eher so:

uint8_t Text[]="Dies ist ein Text.";
uint8_t Ausgabe[sizeof(Text)*8];

Oder anstelle von uint8_t unsigned char.
I.d.R. fügt der C-Compiler ein 0x0 hinten dran, das musst du nicht tun. Was mich ärgert, ist, dass diese Escapesequenzen hier von der Software verhunzt werden; schau dir mal deinen hochgeladenen Quelltext an..
---


Zitat :

for(x=0;x<8;x++)

{

Ausgabe[x]=(Text[i]& 1)>>x;

}

Nein, so gehts nicht. Der Ansatz war ok, aber zwei Sachen passieren hier falsch:
1. x ändert sich immer wieder von 0 bis 7, du überschreibst also die ersten 8 Byte im Puffer immer wieder.
2. Welche Ergebnisse können denn bei dieser Operation herauskommen: entweder 1, wenn das Ergebnis 1 ist oder eben 0. Das sind aber keine darstellbaren Zeichen! Da muss noch ein Offset mit drauf, z.b '0'.
3. >>x ist ineffizient, da der Assembler dort kein rol einsetzen kann, sondern eine Variable Anzahl nach links schieben muss.

So würde ich das machen:

void dual(unsigned char arg, unsigned char *buffer)
{
unsigned char i;
for(i=0;i<8;i++, buffer++, arg<<=1)
*buffer = (arg&0x80) ? '1' : '0';
};

Klar?

weiter:


unsigned char *strtobin(unsigned char *strin, unsigned char *strout)
{
unsigned char *strret=strout;
while(*strout){
dual(*strin, strout);
strin++;
};
*strout=0; /* terminieren */
return strret;
};

Auch klar?

---
Man könnte bzw. sollte, worauf ich jetzt verzichtet habe, die Zeiger sichern, bevor man sie verändert. Dadurch wird kein Fehlverhalten durch falsche Zeige im Programm verursacht.

Noch was:
Auf µCs hat man nicht immer soviel Platz. Sollten die Daten direkt ausgegeben werden (Display, Uart, etc.), dann kann man das direkt dort machen, wo man sonst in den Ausgabepuffer schreiben würde.

void dual(unsigned char arg, void (*output)(unsigned char))
{
unsigned char i;
for(i=0;i<8;i++,arg<<=1)
output( ( arg&0x80 ? '1' : '0' ) );
};

Aufgerufen wirds dann so:
dual(value, lcdChar);
(in value steht der Wert, lcdChar ist eine denkbare Funktion, die man übergeben kann, um je ein Byte auszugeben, denkbar wäre auch sowas wie terminlaChar oder so. Halt eine Funktion, die ein Zeichen irgendwo ausgibt.)

Es gibt viele denkbare Möglichkeiten.

P.S.: Das habe ich hier schnell hingekritzelt, kann sein, dass es noch nicht zu 100% läuft. Aber das ist ja auch nicht meine Aufgabe.



_________________


[ Diese Nachricht wurde ge&auml;ndert von: DonComi am 17 Jun 2008 23:04 ]

[ Diese Nachricht wurde ge&auml;ndert von: DonComi am 17 Jun 2008 23:06 ]

[ Diese Nachricht wurde ge&auml;ndert von: DonComi am 17 Jun 2008 23:09 ]

[ Diese Nachricht wurde ge&auml;ndert von: DonComi am 17 Jun 2008 23:12 ]

[ Diese Nachricht wurde geändert von: DonComi am 17 Jun 2008 23:18 ]

BID = 528687

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

So, da ich irgendwie noch dazugekommen bin; hier eine funktionierende Version.



Code :


static unsigned char *dual(unsigned char arg, unsigned char *puffer)
{
unsigned char i;

for(i=0;i<8;i++, puffer++, arg <<= 1)
*puffer = (arg&0x80 ? '1' : '0');

return puffer;
};


unsigned char *tobin(unsigned char *strin, unsigned char *strout)
{
unsigned char *strret=strout;

while(*strin){

strout=dual(*strin, strout);
strin++;
};

*strout=0;

return strret;
};



Wie gesagt, auf µC, die diese Ausgabe direkt auf ein Display schreiben, sollte man nicht unnötig große Pufferbereiche anlegen, sondern gleich die Zeichen schreiben. Das hat den Vorteil, dass es schneller und SRAM-sparender geht. Denn SRAM ist knapp und man muss immer achtmal soviel reservieren, wie die Strings maximal lang sind! In Rechnern, wo wesentlich mehr Speicher verfügbar ist, holt man sich einfach dynamisch Speicher, schreibt den voll, gibt ihn aus und gibt ihn wieder frei. Aber bei µCs, vergiss es .

_________________


[ Diese Nachricht wurde geändert von: DonComi am 17 Jun 2008 23:53 ]

BID = 528871

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Vielen vielen vielen Dank für die Bemühung. Ich weiß es ist nicht immer leicht mit einem verständnislosen und einem Begriffsstutzigen wie mir zu helfen.



Manchmal könnte ich mir selber

So nun zu deinem Code. Ich möchte nicht irgendwie diesen Code kopieren und einfach vergessen wenn es funktionert, ich will den Code verstehen, darum die nächsten (dämlichen) Fragen:

Was ist der unterschied zwischen signed char und unsigned char?

Mit der folgenden Zeile komme ich noch nicht klar:



Code :



for(i=0;i<8;i++, puffer++, arg <<= 1)

*puffer = (arg&0x80 ? '1' : '0');



puffer++ der Pointer wird um eins erhöht oder?

arg <<= das char arg wird um eins nach links geschoben?

? '1' : '0' was macht dieser Programmteil?

und dann ist da noch etwas:



Code :



*strout=0;




Wieso wird der Pointer für die Ausgabe auf 0 gesetzt?

Nun zur aller letzten Frage (im Moment):

Soweit ich weiß gibt es kein bool in C. Was verwendet man hier am Besten?

Danke

Mfg
Rambodischien



BID = 528912

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

OK, auch wenn ich einen hinter der Binde habe grade (gute Kumpels verabschiedet für die nächsten Jahre ), versuche ich mal, die Fragen zu beantworten .


Zitat :
So nun zu deinem Code. Ich möchte nicht irgendwie diesen Code kopieren und einfach vergessen wenn es funktionert, ich will den Code verstehen, darum die nächsten (dämlichen) Fragen:

Gute Einstellung; da hilft man gern

----

Zitat :

Was ist der unterschied zwischen signed char und unsigned char?

Signed (signiert) sind vorzeichenbehaftete Ganzzahlen, dazu wird das 7. Bit benutzt: ist es 1, so ist die Zahl negativ (Vorzeichen -), andernfalls positiv. Ist im Programm die Notwendigkeit nach vorzeichenbehafteten Zahlen nicht gegeben (z.B. sind Zeichen i.d.R. vorzeichenlos ), dann fügt man vorne ein unsigned an. Standardmäßig, also wenn signed oder unsigned weggelassen wird, nimmt der Compiler nämlich signed! (kann man ausschalten).
Normalerweise benutzt man einfach char* als Zeiger für Strings, auf µCs würde ich da wie gesagt eher unsigned nehmen, da es sonst zu Klimmzügen kommen könnte.


Zitat :

Mit der folgenden Zeile komme ich noch nicht klar:




Code :






for(i=0;i<8;i++, puffer++, arg <<= 1)



*puffer = (arg&0x80 ? '1' : '0');





puffer++ der Pointer wird um eins erhöht oder?

Korrekt.


Zitat :
arg <<= das char arg wird um eins nach links geschoben?

Ja, uns der geänderte Wert wird nach arg zurückgeschrieben. Man könnte auch schreiben

arg = arg << 1;



Zitat :

? '1' : '0' was macht dieser Programmteil?

Das ist ein Operator, der den Ausdruck anfangs auf Gültigkeit (wahr oder falsch / true / false; siehe unten) auswertet. Wenn er wahr ist, dann wird der Teil nach dem ? ausfgeführt, andernfalls der Wert hinter dem Kolon : . In diesem Fall steht dort nur eine Konstante, also wird diese genommen. Dort kann aber auch Programmkode stehen. Er entspricht etwa der Konstruktion


if(arg)
... = '1';
else
... = '0';

Er sorgt hier auch dafür, dass darstellbare Zeichen für gesetze/gelöschte Bits im String auftauchen, eben die Zeichen '0' oder '1' als ASCII-Kode.


Zitat :

---
*strout=0;
---
Wieso wird der Pointer für die Ausgabe auf 0 gesetzt?



Wird er ja nicht. Das *-Zeichen dereferenziert den Zeiger, es wird also der Wert, auf den strout zeigt, auf 0 gesetzt. Das ist eben u.a. das Zeichen für die Terminierung des Strings .
Ich weiß ja vorher nicht, wie groß evtl. der Puffer ist. Hiermit setze ich explizit das Ende des Strings.

Würde ich den Zeiger auf 0 setzen, sähe das so aus:
strout=0;



Zitat :

Soweit ich weiß gibt es kein bool in C. Was verwendet man hier am Besten?

C wertet Ausdrücke wie folgt aus:
Ist eine Zahl / Ausdruck gleich 0 (NULL), dann entspricht das dem logischen false, andernfalls, also alles andere ungleich 0 entspricht true.
Der Standard von C kennt keine boolschen Ausdrücke wie true und false, jedoch stehen diese mit dem Einbinden von stdbool.h zur Verfügung.

Man kann das auch als Enumeration verstehen:

typedef enum bool__ { false=0, true} bool;

Das heißt: alles ungleich 0 ist true, 0 ist false.
So einfach ist das .


_________________

BID = 530182

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Hi

Es hat geklappt vielen herzlichen Dank für die Erklärung.

Jetzt habe ich zwei weitere Fragen:

Zur ersten Frage:


Zitat :

Man kann das auch als Enumeration verstehen:

typedef enum bool__ { false=0, true} bool;


Ich denke hier wird ein bool definiert.

Zur zweiten Frage:

Wie mache ich jetzt von diesem binärem char[] einen hex char[].

Also wenn ich z.B.: T eingeben wird daraus 01010100 und danach soll das ganze in ein Hex umgewandelt werden also 54.

Im Internet habe ich nichts brauchbares gefunden.

Mfg
Rambodischien


BID = 530346

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Das ist doch einfach, jetzt leiste du mal was; ich gebe dir eine Hilfestellung:

1. Wieviel Speicher wird für den Zielstring benötigt?
2. Die Basis vom Hexadezimalsystem ist?
3. und nochmal richtig nett von mir: ein Nibble entspricht genau einem Zeichen im Hexadezimalkode! Was ist also naheliegend zu tun?
4. wenn die Zahl größer als 0x9 ist, dann werden andere ASCII-Zeichen benötigt, nämlich a, b, c oder A, B, C. Welche Prüfung mus also stattfinden?

Edit:

Zitat :

[...] wird daraus 01010100 und danach soll das ganze in ein Hex umgewandelt werden [...]

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

Der Prototyp sollte so etwa aussehen:
unsigned char *hex8(unsigned char arg, unsigned char *buffer);

Oder, etwas schöner:

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


Zitat :

Ich denke hier wird ein bool definiert.

Gönau.
Das tut aber der Header stdbool.h auch.



_________________


[ Diese Nachricht wurde geändert von: DonComi am 25 Jun 2008  0:00 ]

BID = 530490

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Ich habe mal versucht das ganze zu machen:



Code :



#include <math.h>

unsigned char* tohex(unsigned char *bin, unsigned char *hex)
{
unsigned char y;
unsigned int buffer;

while(*bin)
{
for (y=0;y<4;y++,bin++)
{
if(*bin==1)
{
buffer=buffer + pow(2,y);
}

}
if(buffer < 10)
{
*hex=buffer;
*hex++;
}
else
{
if(buffer==10)
{
*hex='A';
*hex++;
}
if(buffer==11)
{
*hex='B';
*hex++;
}
if(buffer==12)
{
*hex='C';
*hex++;
}
if(buffer==13)
{
*hex='D';
*hex++;
}
if(buffer==14)
{
*hex='E';
*hex++;
}
if(buffer==15)
{
*hex='F';
*hex++;
}
}
}

*hex=0;
return hex;

}




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

Mfg
Rambodischien

[ Diese Nachricht wurde geändert von: Rambodischien am 25 Jun 2008 15:04 ]


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 8 Beiträge verfasst
© x sparkkelsputz        Besucher : 182388122   Heute : 2856    Gestern : 6874    Online : 813        24.11.2024    12:35
7 Besucher in den letzten 60 Sekunden        alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.049674987793