因此,当前,我正在发送一条JSON消息,其中包含我需要从ESP32 UART UART_WRITE_BYTES发送的值,但不确定转换中我会出错的位置。目前,如果我发送234,它将UART以50、51、52,而不是234。想法?我正在使用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('2')的ASCII代码为50,字符3('3')为51,字符4('4')为52。
int checkit = uart_write_bytes(uart_num_2,(const char *)hex, strlen(hex));
如果您观察到上述行,您已经明确地铸造了十六进制,以基本上编码ASCII(假设GCC编译器)中的数据,该数据是通过UART传输的。
在UART接收设备或程序中,您需要将传入数据视为ASCII编码数据。您可以使用Coolterm等终端程序来查看ASCII编码和/或原始数据。
要发送原始数据,您可以避免使用const char *的明确类型铸造 *假设在十六进制中存储的数据为[0x02,0x03,0x04],而不是['2','3','3','4']
我让它与以下更改一起工作:我忘了提到我想一次发送一个角色,所以这意味着将" 234"发送为char,然后将其转换为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));