sprintf RS232

Gast #513907
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.