USART Ausgabe per hTerm am PC

Hero_123

Mitglied
17 Sep 2010
117
2
18
Sprachen
C
Hallo!

Mein ATMega8 sendet per USART Daten an den PC; auf dem PC verwende ich hTerm. Angezeigt wird bei hTerm (das Komma ist der Trenner - die angezeigten Werte
entsprechen den Buchstaben):

angezeigt wird:
46, 46, 47, 115, 108, 97, 118, 101,

angezeigt werden sollte:
., ., /, s, l, a, v, e,

meine USART Funktionen:



CodeBox C und C++
/* Ausgabe der per SPI gesendete Werte ueber USART an PC */
static void sende_wert1(uint8_t *wert, uint8_t laenge) {
    uint8_t i_send;                /* Zaehlervariable fuer Senden */
    i_send = 0;
    char temp_buf[6];            /* buffer in dem Wert gespeichert wird */
    while(i_send < laenge) {
        utoa(wert[i_send], temp_buf, 10);    /* uint8_t in char wandeln */
        usart_puts(temp_buf);                /* schreib den Wert raus */
        usart_puts(", ");                    /* Komma & blank */
        i_send++;                            /* zaehl weiter */
    }
    usart_puts("\n");            /* Zeilenumbruch */
}

/* Funktion, um String auf Terminal auszugeben */
 void usart_puts(char *s) {
    while (*s) {                           /* solange nicht Stringende erreicht */
        usart_putc(*s);                    /* schreib das Zeichen aufs Terminal */
        s++;                            /* Zeichen um 1 weiter zaehlen */
    }
}

/* Funktion, um Character auf Terminal auszugeben */
 void usart_putc(unsigned char c) {
    while(!(UCSRA & (1 << UDRE))) {
    }
    UDR = c;
}



warum werden nicht die Buchstaben angezeigt bzw was muss ich ändern, damit die Buchstaben angezeigt werden? Es liegt m.E. nicht an den hTerm Einstellungen (habe schon alles ausprobiert) :confused:

mfg

Hero_123
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.312
10
38
Hannover
Sprachen
C, C#
Nabend,
hast Du es schon mal mit TeraTerm probiert?
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.312
10
38
Hannover
Sprachen
C, C#
Aus Performance Gründen würde ich Dir empfehlen eine eigene Funktion zu schreiben um auf ASCII zu convertieren.
Ist ziemlich easy. Es sei denn du benötigst die Funktion noch irgendwo für was anderes?
 

Mikro23

Mitglied
2 Jan 2017
294
22
18
Großraum Hannover
Sprachen
C, Assembler
utoa(...) wandelt einen Zahlwert in den ASCII-Wert der Ziffern um.

Aus ‘L‘ zur Basis 10 wird die Zeichenkette “76“.
Aus ‘L‘ zur Basis 16 wird die Zeichenkette “4C“.
Aus ‘L‘ zur Basis 2 wird die Zeichenkette “1001100“ etc.

Nimm

CodeBox C und C++
sprintf(buffer, “%c“, wert);

Da kannst Du auch gleich noch das Komma ranhängen.


CodeBox C und C++
sprintf(buffer, “%c, “, wert);

(Obwohl – wenn Du schon den ASCII-Wert als Zahl hast, kannst Du ihn auch mit putc(…) direkt ausgeben...)
 
Zuletzt bearbeitet:

Janiiix3

Aktives Mitglied
28 Sep 2013
1.312
10
38
Hannover
Sprachen
C, C#
Hier mal eine andere Möglichkeit Zahlen umzuwandeln.

 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.252
135
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Hallo,

ja "umgewandelt" werden muss nichts. HTerm ist auf ASCII Ausgabe eingestellt und dann einfach direkt die Zeichen übertragen.



CodeBox C und C++
void usart_puts(char *s)  // einen ganzen String
void usart_putc(unsigned char c)  // ein einzelnes Zeichen

utoa() ist ein Schritt zu viel, siehe auch die Erläuterung von @Mikro23
utoa(...) wandelt einen Zahlwert in den ASCII-Wert der Ziffern um.

Dirk :ciao:
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.312
10
38
Hannover
Sprachen
C, C#
ja "umgewandelt" werden muss nichts.
Wenn er seine Integer Werte nicht in einen String oder druckbare Zeichen umwandelt, wird er mit seiner aktuellen Ausgabe Funktion nicht viel Spaß haben.
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.252
135
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Hallo Jan,

anscheinend soll nur ein String ausgegeben werden, direkt ascii.
angezeigt wird:
46, 46, 47, 115, 108, 97, 118, 101,

angezeigt werden sollte:
., ., /, s, l, a, v, e,
Grund für das Problem ist die "Umwandlung" zur Basis 10 mit utoa für jedes Zeichen und die Ausgabe des Ergebnisses als String.

Wenn natürlich ein Integerwert als äquivalenter Ascii String ausgegeben werden soll, muss man "umwandeln".
 

Hero_123

Mitglied
17 Sep 2010
117
2
18
Sprachen
C
Hallo Dirk, hallo Mikro23, hallo Janiix3

Vielen Dank für Eure Hilfe!

Zu meinem "Problem" - auf Tastendruck schickt mein Slave ATMeg8 den Filenamen und das Datum per SPI an den Master ATMega8, dieser gibt dann den Filenamen und das Datum am PC und auf einem LCD Display aus.

Der Slave schickt diese Daten als uint8_t Werte per SPI und beim Master müssen diese Werte eben dann umgewandelt werden, damit der String ausgegeben werden kann...

Mit der von Mikro23 vorgeschlagenen Lösung
Nimm

CodeBox C und C++
sprintf(buffer, “%c“, wert);
funktioniert es (Anzeige der Buchstaben), aber der Code wird um einiges größer (von ca 2800 byte wächst er auf ca 3800 byte ...)

mfg

Hero_123
 

Mikro23

Mitglied
2 Jan 2017
294
22
18
Großraum Hannover
Sprachen
C, Assembler
aber der Code wird um einiges größer
Natürlich. Die stdio-Funktionen sind ziemlich umfangreich...

Aber wie Dirk auch schon schrieb

CodeBox C und C++
sprintf(buffer, “%c“, wert);
usart_puts(buffer);
macht im Endeffekt nichts anderes als

CodeBox C und C++
usart_putc(wert)
(Nur mit weniger Aufwand)
 

Hero_123

Mitglied
17 Sep 2010
117
2
18
Sprachen
C
Hallo Mikro23

Vielen Dank für Deine Hilfe / Hinweis :good3:


Natürlich. Die stdio-Funktionen sind ziemlich umfangreich...

Aber wie Dirk auch schon schrieb

CodeBox C und C++
sprintf(buffer, “%c“, wert);
usart_puts(buffer);
macht im Endeffekt nichts anderes als

CodeBox C und C++
usart_putc(wert)
(Nur mit weniger Aufwand)
Ich habe den Hinweis von Dirk irgendwie nicht so richtig ... :(

Habe es jetzt nochmal gemäß Deinem Post #10 gemacht (mit "usart_putc(wert)" - fkt natürlich!!
Lerneffekt - genau lesen .... und eine unnötige lib kann sehr viel Speicher fressen

mfg

Hero_123
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)