Ich versuche gerade eine Funktion zu schreiben, mit der ich über die
UART Schnittstelle Daten über ein RS232 to USB Kabel (COM4) an ein
Terminal auf dem PC schicke, um mir die Daten ansehen zu können. Ich
möchte die UART kennen lernen.
Ich schicke direkt eine 0, wenn value = 0 ist.
Wenn die Zahl > 0 ist, arbeite ich mit einem Modulo Operator und teile
die Zahl immer durch 10, damit ich einzelne Ziffern ins Array setzen
kann.
Die Zahlen werden immer beginnend mit dem letzten Index in das Array
gespeichert.
Wenn die Zahl negativ sein sollte, wird alles mit Nullen gefüllt.
Ich habe nun 2 Fragen.
Da das Array eine Länge von 10 hat sieht die Anordnung von der Zahl 7800
beispielsweise so aus:
xxxxxx7800
Wenn ich diesen Wert über die UART schicke sehe ich am Terminal (HTERM)
einen Zeilenumbruch nach jedem 10. Wert einstelle, sehe ich nicht diese
Anordnung, sondern mir wandern die Zahlen ständig hin und her.
Wenn ich Glück habe sieht es wie folgt aus: (Die nicht gefüllten Felder
werden im HTERM stets mit "*" dargestellt)
******7800
die nächste Zahl zB
*******68
Aber manchmal kann es auch folgendermassen aussehen:
**7800**** (1. Zahl)
7800****** (2. Zahl)
und die nächste Zahl 68 dann
7800*****6 (3. Zahl 68)
8*********
oder auch mal die 100 mit einer folgenden 0
****1000**
Ich verstehe das nicht.
Was mache ich nur falsch? Liegt es daran, dass ich die Felder (value >
0) nicht weiter fülle? Was könnte das Problem sein?
Weiters möchte ich das Programm irgendwie auf Einfachstem Wege dazu
bringen auch negative Zahlen darstellen zu können.
Dazu müsste ich den Typ des Parameters wohl zuerst einmal auf int32_t
umstellen, aber dann habe ich das Problem mit der else.
Gibt es irgendwie eine einfache Lösung oder muss ich die komplette
Funktion umschreiben?
1 | void UART_transmit_Int(uint32_t value)
|
2 | {
|
3 | uint8_t string[10]; // die maximale Zahl kann 10 Stellen haben, deshalb array[10]
|
4 | uint8_t zero = '0';
|
5 |
|
6 | // sende direkt 0, wenn value = 0 und beende die Funktion
|
7 | if (value == 0){
|
8 | HAL_UART_Transmit(&UART1_HANDLER, &zero, sizeof(zero), 1000);
|
9 | return;
|
10 | }
|
11 |
|
12 | for (uint8_t i = 0; i<10; i++)
|
13 | {
|
14 | if(value > 0)
|
15 | {
|
16 | string[9-i] = 48 + (value % 10); /* Das letzte Zeichen im Array string ist 48 => 0 in ASCI-Tabelle +
|
17 | Rest von number und schreibe Zeichen in string*/
|
18 | value /= 10; // teile value dann durch 10
|
19 | }
|
20 | else
|
21 | {
|
22 | string[9-i] = 0x00; //0 // wenn number < 0 fülle Rest mit Nullen auf
|
23 | }
|
24 | }
|
25 |
|
26 | HAL_UART_Transmit(&UART1_HANDLER, string, sizeof(string), 1000); // Drucke dann alle Zeichen im string aus
|