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
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:
1 | |
2 | |
HTH, Torsten
Gast
#5407868
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:
1 | |
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:
1 | |
2: die putchar- und getchar-Funktionen hinzufügen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
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
1 | |
damit printf sofort Daten schickt und nicht auf ein Newline wartet. Alternativ geht das auch als Makro:
1 | |
2 | |
3 | |
Gast
#5407870
Verbesserungsvorschlag: Die Funktion itoa() ist in diesem Fall effizienter und kleiner, als sprintf().
Gast
#5407934
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?
Gast
#5407940
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
Bitte melde dich an, um einen Beitrag zu schreiben.