【发布时间】:2019-07-15 14:32:24
【问题描述】:
我有带有 arduino ide 的 esp32 连接到 canbus。我从 rx_frame.data.u8[] 获取数据流,它有 8 个字节,例如。 [FF、FF、FF、61、3F、FF、FF、FF];
我需要 rx_frame.data.u8[3] 和 rx_frame.data.u8[4] 例如。 61 和 3F,让它们以 intel 字节顺序(反转字节顺序?)例如。 3F61 并转换为 DEC。它应该返回 16255。
问题:我无法将 rx_frame.data.u8[] 转换为 intel 字节顺序,然后转换为 DEC。我尝试了几件事,我能够使用 String engspd1 = String(rx_frame.data.u8[4], HEX) + String(rx_frame.data.u8[3], HEX);但现在我无法将 String engspd1 转换为 DEC。 另外我会解析大量数据,所以我不确定哪种方式最适合解析这种数据流。
附:抱歉,如果我通过不同的命名方式在我的问题中犯了一些错误。我刚从 C、C++ 和 arduino ide 开始。
#include <CAN_config.h>
CAN_device_t CAN_cfg;
void setup() {
Serial.begin(115200);
Serial.println("iotsharing.com CAN demo");
CAN_cfg.speed=CAN_SPEED_250KBPS;
CAN_cfg.tx_pin_id = GPIO_NUM_5;
CAN_cfg.rx_pin_id = GPIO_NUM_4;
CAN_cfg.rx_queue = xQueueCreate(10,sizeof(CAN_frame_t));
//start CAN Module
ESP32Can.CANInit();
}
void loop() {
CAN_frame_t rx_frame;
//receive next CAN frame from queue
if(xQueueReceive(CAN_cfg.rx_queue,&rx_frame, 3*portTICK_PERIOD_MS)==pdTRUE){
//do stuff!
if(rx_frame.MsgID == 217056256) {
String engspd1 = String(rx_frame.data.u8[4], HEX) + String(rx_frame.data.u8[3], HEX);
int engspd2 = engspd1.toInt(); // throws error of course
Serial.println(engspd1);
Serial.println(engspd2);
}
【问题讨论】:
-
没有必要把事情搞得这么复杂。转换为更大的类型后,只需将高位字节左移 8 位,然后按位或与低位字节一起移动。
-
这听起来像是我需要的东西,你有时间展示示例代码吗?
-
我会做类似
unsigned engspd2 = (unsigned) rx_frame.data.u8[4] << 8 | rx_frame.data.u8[3];的事情。 -
Bitshift 效果很好,我认为它没有使用太多资源,非常感谢您提供的精彩示例!