因此,当前,我正在发送一个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));
答案 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));