mysql 将int转换为Char不适用于int类型,但适用于uint16_t sprintf

ql3eal8s  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(163)

我有一个连接到wifi的ESP8266,它与各种传感器连接。我正在向mySQL数据库发送数据。当我发送HTTP post请求时,其中一个传感器的值被发送,但另一个传感器没有,即使我基本上使用的是相同的代码。有什么帮助吗?我是嵌入式C的新手,我有一种感觉,我的字符连接不正确。
变数:
全局声明的值

typechar *URL = "http://localHost/post-sensor-readings.php";
char *postHeader = "api_key";
char *tempEntry = "&temphumSensor=";
char *soilEntry = "&soilmoistSensor=";
char *npkEntry = "&npkSensor=";
char *tempSensor[10];
char *humiditySensor;
char *moistureSensor[4];

更新mysql数据库的代码:

char output_buffer[MAX_HTTP_OUTPUT_BUFFER] = {0};
        esp_http_client_config_t config = {
            .url = "http://httpbin.org/get", 
        };

esp_http_client_handle_t client = esp_http_client_init(&config);
        esp_err_t err = esp_http_client_open(client, 0);



char  post_data[151];
        char *post_header ="api_key=tPmAT5Ab3j7F9";
         strcpy(post_data, post_header);

         strcat(post_data, tempEntry);
         strcat(post_data, tempSensor);

         strcat(post_data, soilEntry);
         strcat(post_data, moistureSensor);

         esp_http_client_set_url(client, "http://localHost/post-sensor-readings.php");
            esp_http_client_set_method(client, HTTP_METHOD_POST);
            esp_http_client_set_header(client, "Content-Type", "application/x-www-form-urlencoded");

}

尝试更新温度(不起作用)

void temperature_task(void *arg)
{
    ESP_ERROR_CHECK(dht_init(DHT_GPIO, false));
    vTaskDelay(2000 / portTICK_PERIOD_MS);

    int  temperature[100];
    int humidity;
    while (1)
    {

        if (dht_read_data(DHT_TYPE_DHT22, DHT_GPIO, &humidity, &temperature[0]) == ESP_OK) {
            // e.g. in dht22, 604 = 60.4%, 252 = 25.2 C
            // If you want to print float data, you should run `make menuconfig`
            // to enable full newlib and call dht_read_float_data() here instead
            printf("Humidity: %d Temperature: %d\n", humidity, temperature[0]);
            sprintf(tempSensor, "%d", temperature[0]);
//            fprintf( stderr, "%s", tempSensor);
            //itoa(temperature,tempSensor,10);

        vTaskDelay(5000 / portTICK_PERIOD_MS);
    }
    }
    vTaskDelete(NULL);
}

更新湿度(有效)

void soilHumidity_task(void *arg){
    static const char *TAG = "READING HUMIDITY";
    adc_config_t config1 ={.mode =  0, .clk_div =8};
    ESP_ERROR_CHECK(adc_init(&config1));

    uint16_t adc_data[100];
    while (1) {
        if (ESP_OK == adc_read(&adc_data[0])) {
            ESP_LOGI(TAG, "ADC read: %d\r\n", adc_data[0]);
            printf("%d", adc_data[0]);

            sprintf(moistureSensor, "%d", adc_data[0]);

            vTaskDelay(1000 / portTICK_RATE_MS);

        }
    }
    vTaskDelete(NULL);
}

5w9g7ksd

5w9g7ksd1#

  1. ESP32的IDF函数原型是:
bool dht_read_data(uint8_t pin, int16_t *humidity, int16_t *temperature);

你传递了对两个整数的引用。它是UB。使用正确的类型int16_t

  1. sprintf需要对char的引用,而不是对char *的引用。
    1.“%d”仅在将参数传递给可变变量函数时隐式转换为C语言中的int时有效。

相关问题