工具/软件:
下午好!
我希望这篇文章能很好地找到您
我使用的是 EVM430F6736、我将尝试通过 UART 使用 ESP32向智能仪表发送十六进制命令、来手动读取计算值。
我之前使用过这种技术来读取电气参数值(Vrms、IRMS...) 它工作正常(因此接线和外围设备运行良好)。
但是、当我更改命令以读取 EVM430中的现有校准值时、我没有收到预期的结果。
我发送了以下命令:
{0x55、0xAA、0x05、0x04、0x03、 0x00、0x07、0x00}
然而我收到了:( a.k.a 收到的 UART 消息是)
{0x55、0xAA、0x05、0x04、0x03、 0x01、0x08、0x00}
我现在将提供用于发送和日志的完整任务(PS:我将使用 Esspressif IDE 对 ESP32编程)
代码:
/**
*@用于校准有功功率的简短任务。 这项任务不是最终任务的一部分
*运行代码,但将保留在这里,以供将来可能需要的校准
*
*@param arg 任务参数(未使用)
*/
void evm_calibration_task (void * arg)
{
uart_event_t 事件;
//分配用于接收和处理数据的缓冲区
uint8_t* rx_buffer =(uint8_t*) malloc (RX_BUF_SIZE + 1);
uint16_t rx_buffer_length;
//请求数据的命令序列:将 EVM430设置为"激活"状态
uint8_t TX_FLAG_COMMAND[8]={0x55、0xAA、0x05、0x04、0x03、 0x00、0x07、0x00};
静态常量字符*TX_TASK_TAG ="evm_Calibration_task";
ESP_LOG_LEVEL_SET (TX_TASK_TAG、ESP_LOG_INFO);
esp_Logi (tx_task_tag、"开始校准任务");
//发送命令的每个字节并在字节之间进行延迟
对于(int i = 0;i < 8;i++)
{
sendData (tx_task_tag、tx_flag_command[i]);
vTaskDelay (1/portTICK_PERIOD_MS);
}
while (1)
{
if (xQueueReceive (g_uart_queue、(void *)&event、4000/ portTICK_period_MS))
{
RX_BUFFER_LENGTH= UART_READ_BYTES (UART_NUM_1、RX_BUFFER、RX_BUF_SIZE、500/ portTICK_PERIOD_MS);
esp_log_buffer_HEXDUMP (tx_task_tag、rx_buffer、rx_buffer_length、esp_log_info);
esp_Logi (tx_task_tag、"Calibration values Received! 长度:%d"、rx_buffer_length);
}其他
{
esp_Logi (tx_task_tag、"No values received");
}
}
vTaskDelete(NULL);//完成后删除此任务
}
日志:
I (7238) EVM_Calibration_task:开始校准任务
i (7248) EVM_Calibration_task:写入1个字节
i (7248) EVM_Calibration_task:写入1个字节
i (7258) EVM_Calibration_task:写入1个字节
i (7258) EVM_Calibration_task:写入1个字节
i (7268) EVM_Calibration_task:写入1个字节
i (7268) EVM_Calibration_task:写入1个字节
i (7278) EVM_Calibration_task:写入1个字节
i (7278) EVM_Calibration_task:写入1个字节
i (7288) main_task:从 app_main ()返回
i (7788) EVM_Calibration_task:0x3ffd9bc4 55 aa 05 04 03 01 08 00 |u. |
I (7788) EVM_Calibration_task:收到校准值! 长度:8
I (11788) EVM_Calibration_task:未接收到值