sprintf RS232

Gast #513907
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++;
}
}
}
Gast #513933
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)
Gast #513957
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
Gast #514013
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.