Преобразование valuestring или valueint из cJSON для отправки с использованием uart_write_bytes завершилось неудачно - PullRequest
0 голосов
/ 18 декабря 2018

Итак, в настоящее время я отправляю сообщение JSON, содержащее значение, которое мне нужно отправить из UART ESP32 uart_write_bytes, но я не уверен, в чем я ошибаюсь при преобразовании.В настоящее время, если я отправлю 234, он выходит из UART как 50, 51, 52, а не 234. Мысли?Я использую esp-idf с компилятором GCC, а не с Arduino.

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 голосов
/ 19 декабря 2018

Я получил его для работы со следующими изменениями: я забыл упомянуть, что хочу посылать по одному символу за раз, что означает отправку 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)); 
0 голосов
/ 19 декабря 2018

Это связано с тем, что код ASCII для символа 2 ('2') равен 50, для символа 3 ('3') - 51, а символа 4 ('4') - 52.

intcheckIt = 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']

...