Forum: Mikrocontroller und Digitale Elektronik HAL_UART_Transmit Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen Leute,

die Verbindung funktioniert und ich empfange die Daten mit Putty auf 
meinem Rechner. Ich wollte noch die Sekunden übertragen aber irgendwie 
bekomme ich es nicht hin. Ich habe auch in Erfahrung gebracht das man 
den printf Befehl bearbeiten kann um direkt ans UART auszugeben. Habe 
ich aber auch nicht hinbekommen.

Das hier ist die Anleitung mit dem printf (wäre nur praktisch aber nicht 
nötig wenn das funktioniert)
https://www.waveshare.com/wiki/STM32CubeMX_Tutorial_Series:_USART

Und hier mein Code
  while (1)
  {

  int i=1;
  char *msg = "Hello World! \n\r";
  char *msg1 = "Programm runs ";
  char *msg2;
  HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0xFFFF);

  while(1){

  sprintf(msg2,"%d",i);
  HAL_Delay(1000);
  HAL_UART_Transmit(&huart2, (uint8_t*)msg1, strlen(msg), 0xFFFF);
  HAL_UART_Transmit(&huart2, (uint8_t*)msg2, strlen(msg), 0xFFFF);
  i = i + 1;

  }

Vielen dank im Voraus

von Torsten R. (Firma: robitzki.de) (torstenrobitzki)


Bewertung
1 lesenswert
nicht lesenswert
Walt N. schrieb:
> Und hier mein Code

>   char *msg2;
>   sprintf(msg2,"%d",i);

msg2 ist eine Zeiger auf ein char, der nicht initialiert ist und damit 
irgendwo hin zeigt. In C ist char* häufig ein Synonym für einen String, 
in dem der Zeiger auf dass erste Zeichen eines Array von char zeigt. 
sprintf() erwartet einen Zeiger auf das erste Zeichen, dass ausreichend 
groß ist, um den Erzeugten Text dort hin zu kopieren:
    char msg2[ 100 ];
    sprintf( msg2, "%d", i );

HTH,
Torsten

von bla (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Zu deinem Problem: wie Torsten schrieb, klappt das mit der 
Pointerinitialisierung nicht so ganz, da ein Pointer nur einen 
Platzverbrauch vone einer Speicheradresse hat. Besser wäre da ein Array:
 char msg[] = "Hello, World!\r\n";
denn dann wird gleich noch Speicher für deinen sTring belegt und 
befüllt.

Ansosnten hier meine Lösung. Ich vermute mal, du arbeitest mit nem 
STM32Fxxx.

So hab ich den UART mit printf zum Laufen gebracht:
1: USART aktivieren:
MX_USART1_UART_Init();

2: die putchar- und getchar-Funktionen hinzufügen:
int __io_putchar(int ch) {
  HAL_UART_Transmit(&huart1, (uint8_t *) &ch, 1, 0xFFFF);
  return ch;
}

int __io_getchar(void) {
  int retval = -1;
  HAL_UART_Receive(&huart1, (uint8_t*) &retval, 1, 0xF);
  return retval;
}

3: In deinem Verzeichnis sollte irgendwo ne syscalls.c rumliegen, die 
ins Source-verzeichnis kopieren (CubeMX erzeugt die für mich mit).

4: optional noch ein
setvbuf(stdout, NULL, _IONBF, 0);
damit printf sofort Daten schickt und nicht auf ein Newline wartet.


Alternativ geht das auch als Makro:
#define PRINTF(...) do{char text[255]; \
  int l = snprintf(text,255, __VA_ARGS__);\
  HAL_UART_Transmit(&huart1,(uint8_t*)text,l,0xFF);}while(0)

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
Verbesserungsvorschlag: Die Funktion itoa() ist in diesem Fall 
effizienter und kleiner, als sprintf().

von bla (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Verbesserungsvorschlag: Die Funktion itoa() ist in diesem Fall
> effizienter und kleiner, als sprintf().

Gibts eigentlich auch ein ftoa o.ä. für floats?

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ich glaube nicht, aber man kann Fließkommazahlen in die Teile vor und 
hinter dem Komma aufsplitten.
https://www.tutorialspoint.com/c_standard_library/c_function_modf.htm

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.