Преглед на файлове

change uart send float str from chatGPT

NEC преди 9 месеца
родител
ревизия
4c79bb2c85
променени са 1 файла, в които са добавени 56 реда и са изтрити 23 реда
  1. 56 23
      HW_UART_ATY.c

+ 56 - 23
HW_UART_ATY.c

@@ -136,35 +136,68 @@ void UartSendFloat(float dataFloat, uint8_t endian, struct HW_UART_ATY_Dev* dev)
  * @note    float and double is the same in C51
  */
 void UartSendFloatStr(float dataFloat, uint8_t DECIMALS_NUM, struct HW_UART_ATY_Dev* dev)
-// void UartSendFloatStr(double dataFloat)
 {
-    uint8_t i = 0;
-    uint8_t dataStr[10];    // ulongint 4294967295, 6.4
-    unsigned long int tempSaveData = 0;
+    uint32_t integerPart, decimalPart;
+    uint32_t power10 = 1;  // Used to compute 10^DECIMALS_NUM
+    uint8_t i;
+    
+    // Handle negative numbers
+    if (dataFloat < 0) {
+        UartSendByte('-', dev);
+        dataFloat = -dataFloat; // Convert to positive
+    }
 
-    for(i = 0; i < 10; i++)
-        dataStr[i] = 0;
+    // Extract integer part
+    integerPart = (uint32_t)dataFloat;
 
-    if(dataFloat < 0)
-    {
-        dataFloat = -dataFloat;
-        UartSendByte('-', dev);
+    // Compute 10^DECIMALS_NUM
+    for (i = 0; i < DECIMALS_NUM; i++) {
+        power10 *= 10;
     }
-    tempSaveData = (dataFloat * 10000) + 0.5;
-    for(i = 0; tempSaveData != 0; i++)
-    {
-        dataStr[10 - 1 - i] = tempSaveData % 10;
-        tempSaveData /= 10;
+
+    // Compute decimal part (avoiding floating-point precision issues, +0.5 for rounding)
+    decimalPart = (uint32_t)((dataFloat - integerPart) * power10 + 0.5);
+
+    // Send integer part
+    char buf[10]; // Buffer for integer part characters
+    uint8_t index = 0;
+    if (integerPart == 0) {
+        buf[index++] = '0'; // Directly send "0"
+    } else {
+        while (integerPart > 0) {
+            buf[index++] = (integerPart % 10) + '0';
+            integerPart /= 10;
+        }
+        // Reverse the integer part before sending
+        while (index > 0) {
+            UartSendByte(buf[--index], dev);
+        }
     }
-    // UartSendByte(i + 48);
-    if(i < 5)
-        i = 5;
-    while(i--)
-    {
-        UartSendByte(dataStr[10 - 1 - i] + 48, dev);
-        if(i == DECIMALS_NUM)
-            UartSendByte('.', dev);
+
+    // Send decimal point
+    if (DECIMALS_NUM > 0) {
+        UartSendByte('.', dev);
+
+        // Handle leading zeros in the decimal part
+        for (i = DECIMALS_NUM - 1; i > 0; i--) {
+            if (decimalPart < power10 / 10) { 
+                UartSendByte('0', dev);  // Send leading zeros
+                power10 /= 10;
+            }
+        }
+
+        // Send decimal part
+        index = 0;
+        while (decimalPart > 0) {
+            buf[index++] = (decimalPart % 10) + '0';
+            decimalPart /= 10;
+        }
+        while (index > 0) {
+            UartSendByte(buf[--index], dev);
+        }
     }
+
+    // Append a space at the end
     UartSendByte(' ', dev);
 }