Forum: Mikrocontroller und Digitale Elektronik sprintf RS232


von Greenhorn (Gast)


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++;
}
}
}

von Jörg X. (Gast)


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)

von Greenhorn (Gast)


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

von Jörg X. (Gast)


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

von Greenhorn (Gast)


Lesenswert?

hallo,

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.