www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sprintf RS232


Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habbe folgendes Problem:

Wenn ich versuche kanal_nummer 0 und 1 ausgeben will, werden falsche 
daten über die rs232 schnittstelle gesendet.Wähle ich immer nur einen 
Kanal aus dann wird das richtige ergebnis ausgegeben. Kann mir jemand 
helfen.
Danke

void rs232_senden(struct adc_messung *struct_senden)
{
unsigned int i=0;
unsigned int sample=0;
unsigned int kanal_nummer=0;
unsigned int rs232_send_field[5];
char rs232_string[20];
for(kanal_nummer=0;kanal_nummer<2;kanal_nummer++)
    {
for(sample=0;sample<5;sample++)
    {
    switch(kanal_nummer)
         {
       case 0:    rs232_send_field[sample]=(*struct_senden).kanal_0 
[sample];break;
     case 1:    rs232_send_field[sample]=(*struct_senden).kanal_1 
[sample];break;
     }
    }
sprintf(rs232_string,"\n\r%i   %i   %i   %i   %i 
",rs232_send_field[0],rs232_send_field[1],rs232_send_field[2],rs232_send 
_field[3],rs232_send_field[4]);
UBRR3H=0;
UBRR3L=11;
UCSR3B=(1<<TXEN3);
UCSR3C=(3<<UCSZ30);
while(!(rs232_string[i]=='\0'))
{
while(!(UCSR3A & (1<<UDRE3)))
{
}
UDR3=rs232_string[i];
_delay_ms(5);
i++;
}
}
}

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für ein µC? Welcher Compiler?
- beim AVR-gcc kannst du kein "int" auf ein mal in das UDR schreiben, 
das hat nur 8Bit
- wie sieht das struct "adc_messung" aus ?
- der Platzhalter "%i" ist für "signed"-typen
- es gibt [ c ] [ /c ] tags (aber ohne leerzeichen, für die Optik ;) )
(- auf Elemente von struct-pointern kann man mit "struct_pt->elem" 
zugreifen, ist aber nicht so wichtig)

Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ATmega2560
WinAVR


Das Problem liegt irgendwie in der sprintf-Funktion. Das Programm 
funktioniert
, wenn ich nur einen Kanal ausgebe. Aber sobald ich kanal_nummer von 0-1 
ausführen lasse, zeigt es mir merkwürdige Daten an, die ich nicht messe.

Vielen Dank

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

sry, das mit der int-zuweisung war quatsch von mir.

-aber: wird die Variable "i" für die Ausgabe, am ende wieder "genullt"?
 wenn nicht (wie im gezeigten code), läuft die von dort weiter, wo 
vorher abgebrochen wurde, da kann viel passieren, also nach der 
while-schleife 0-setzen.
-der "char rs232_string[20];" ist im schlimmsten Fall zu kurz:
"\n\r%u   %u   %u   %u   %u" ist worst-case 35 Zeichen lang, wenn du nur 
die adc-Werte verschickst: 30 Zeichen
"\n\r1023  1023  1023  1023  1023"
 aber wie gesagt "worst case", nur wenn alles Maximalwerte, d.h. über 
1000 (dezimal), sind

Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

du hast recht gehabt, die variable i hatte ich vergessen. Durch das 
Rücksetzen klappt es jetzt.Danke

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.