从cJSON转换valuestring或valueint以使用uart_write_bytes发送失败

时间:2018-12-18 15:19:47

标签: pointers uart esp32

因此,当前,我正在发送一个JSON消息,其中包含我需要从ESP32 UART uart_write_bytes发送的值,但不确定在转换中哪里出错。 目前,如果我发送234,它将以50、51、52和234的形式退出UART。 有什么想法吗? 我在GCC编译器而不是Arduino上使用esp-idf。

char hex[8] = {0xff, 0xff, 0xff, 0xff};
cJSON* message'
int intValue = 0;
char *stringValue= "999";

if ((message = cJSON_GetObjectItem(root->child, "msg")) != NULL)
{
    if((intValue = cJSON_GetObjectItem(message, "Number")->valueint) != NULL)
    {
        ESP_LOGI(LOG_TAG, " this is the Number %i ", intValue);
    }
    if((stringValue = cJSON_GetObjectItem(message, "Number")->valuestring) != NULL)
    {
       ESP_LOGI(LOG_TAG, " This is NumberString %s ", stringValue);
    }   
}

char numStrStr[3];
sprintf(numStrStr, "%s", stringValue );
for(int j = 0; j < sizeof(str); j++)
{
    hex[j] = numStrStr[j];
}

int checkIt = uart_write_bytes(UART_NUM_2, (const char *)hex, strlen(hex));

2 个答案:

答案 0 :(得分:1)

这是因为字符2('2')的ASCII码为50,字符3('3')的ASCII码为51,字符4('4')的ASCII码为52。

  

int checkIt = uart_write_bytes(UART_NUM_2,(const char *)hex,   strlen(hex));

如果您观察到以上行,则已将十六进制显式地转换为const char *,本质上将数据编码为ASCII(假设是gcc编译器),并通过UART传输。

在UART接收设备或程序中,您需要将传入数据视为ASCII编码数据。您可以使用CoolTerm之类的终端程序查看展位ASCII编码和/或RAW数据。

要发送原始数据,可以避免使用const char *进行显式类型转换,假设存储在十六进制中的数据是[0x02、0x03、0x04]而不是['2','3','4']

答案 1 :(得分:0)

我可以进行以下更改: 我忘了提一下,我想一次发送一个字符,这意味着将'234'作为一个字符发送,然后将其转换为一个int,然后进行有趣的数学运算,将其分为1、10和100发送到串行。

cJSON *message;
int intValue = 0;
const char *buffValue = "999";

hex[0] = 0xfe;
hex[1] = 0x01;
hex[2] = 0x01;
hex[3] = 0x00;

if((buffValue = cJSON_GetObjectItem(message, "NUmber")->valuestring) != NULL)
{
   ESP_LOGI(LOG_TAG, " This is Value String %s ", buffValue);
   ESP_LOGI(LOG_TAG, "strtol %ld ", strtol(buffValue, NULL, 10));
   intValue = strtol(buffValue, NULL, 10);

    int valueArray[3] = {0};
    int increment = 0;
    while(intValue > 0)
    {
        int digitValue = intValue % 10;
        valueArray[increment] = digitValue;
        intValue /= 10;
        increment ++;
    }
    hex[3] = valueArray[2];
    hex[4] = valueArray[1];
    hex[5] = valueArray[0];
}   


int checkIt = uart_write_bytes(UART_NUM_2, (const char *)hex, strlen(hex));