|
@@ -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
|
|
* @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(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);
|
|
UartSendByte(' ', dev);
|
|
|
}
|
|
}
|
|
|
|
|
|