keil5 sprintf接口无法使用
1.背景
esp8266使用使用sprintf进行数据整合的时候发现,除了小数点类型的数据都正常使用;
上网搜索发现编译器问题;修改编译器还报错;干脆让chat写一个浮点型转字符的接口
2.解决办法
实现的接口
void doubleToString(double value, char *buffer) {
int intPart = (int)value; // 整数部分
double decimalPart = value - intPart; // 小数部分
int decimalInt = (int)(decimalPart * 100); // 保留两位小数
// 将整数部分转换为字符串
char temp[50];
int i = 0;
if (intPart == 0) {
temp[i++] = '0'; // 处理整数部分为0的情况
} else {
while (intPart > 0) {
temp[i++] = (intPart % 10) + '0';
intPart /= 10;
}
}
// 反转整数部分的字符
int j = 0;
for (j = 0; j < i / 2; j++) {
char tempChar = temp[j];
temp[j] = temp[i - j - 1];
temp[i - j - 1] = tempChar;
}
// 将整数部分字符复制到 buffer
for (j = 0; j < i; j++) {
buffer[j] = temp[j];
}
// 添加小数点
buffer[i++] = '.';
// 将小数部分转换为字符串(保留两位小数)
if (decimalInt < 10) {
buffer[i++] = '0'; // 处理小数部分小于10的情况
}
buffer[i++] = (decimalInt / 10) + '0'; // 十位数字
buffer[i++] = (decimalInt % 10) + '0'; // 个位数字
// 添加字符串结束符
buffer[i] = '\0';
}
使用实例
uint8_t atk_mw8266d_publish_data(void)
{
uint8_t ret;
float EnvHumidity = 26.68; // 示例单精度浮动值
double AmbientTemperature = 27.88; // 示例双精度浮动值
int LED1Switch = 1; // LED1 的开关状态(1 表示开启,0 表示关闭)
char cmd[512];
char EnvHumidityStr[50];
char AmbientTemperatureStr[50];
// 调用接口将浮点数转化为字符串
doubleToString(EnvHumidity, EnvHumidityStr);
doubleToString(AmbientTemperature, AmbientTemperatureStr);
// 清空命令数组
memset(cmd, 0, sizeof(cmd));
// 这里将发布命令直接写死,不需要传递参数
sprintf(cmd, "AT+MQTTPUB=0,\"/sys/ghogg2UpVtN/esp8266-12f/thing/event/property/post\",\"{\\\"params\\\":{\\\"LED1Switch\\\":%d}}\",1,0",LED1Switch);
// 发送命令并等待返回结果
ret = atk_mw8266d_send_at_cmd(cmd, "OK", 1000); // 等待返回 "OK" 表示发布成功
if (ret == ATK_MW8266D_EOK)
{
printf("阿里云数据LED1Switch更新成功\n");
}
else
{
printf("阿里云数据LED1Switch更新失败\n");
return ATK_MW8266D_ERROR; // 发布失败
}
// 清空命令数组
memset(cmd, 0, sizeof(cmd));
if( sprintf(cmd, "AT+MQTTPUB=0,\"/sys/ghogg2UpVtN/esp8266-12f/thing/event/property/post\",\"{\\\"params\\\":{\\\"EnvHumidity\\\":%s}}\",1,0", EnvHumidityStr) < 0 )
{
printf("sprintf error\r\n");
}
// 发送命令并等待返回结果
ret = atk_mw8266d_send_at_cmd(cmd, "OK", 1000); // 等待返回 "OK" 表示发布成功
if (ret == ATK_MW8266D_EOK)
{
printf("阿里云数据EnvHumidity更新成功\n");
}
else
{
printf("阿里云数据EnvHumidity更新失败\n");
return ATK_MW8266D_ERROR; // 发布失败
}
// 清空命令数组
memset(cmd, 0, sizeof(cmd));
sprintf(cmd, "AT+MQTTPUB=0,\"/sys/ghogg2UpVtN/esp8266-12f/thing/event/property/post\",\"{\\\"params\\\":{\\\"AmbientTemperature\\\":%s}}\",1,0",AmbientTemperatureStr);
// 发送命令并等待返回结果
ret = atk_mw8266d_send_at_cmd(cmd, "OK", 1000); // 等待返回 "OK" 表示发布成功
if (ret == ATK_MW8266D_EOK)
{
printf("阿里云数据AmbientTemperature更新成功\n");
}
else
{
printf("阿里云数据AmbientTemperature更新失败\n");
return ATK_MW8266D_ERROR; // 发布失败
}
return ATK_MW8266D_EOK; // 发布成功
}