在STM32的单个CAN消息中发送不同数据类型的数据
Sending different datatype data in single CAN message in STM32
在 STM32L4 上使用 CAN 时,我试图发送三种不同的数据类型,即浮点数、布尔值和浮点值。由于在一条消息中可以发送 8 个字节,所以我在一条消息中发送所有三个数据。
我的数据看起来像
float tf;
uint16_t sl;
bool status_tf;
bool status_sl;
如果我能得到一些指导,那就太好了,我如何在单个 CAN 消息中组合所有三种数据类型?
到目前为止,我已经尝试使用 sprintf()
和打印格式说明符。并将组合结果存储在 char TxData[8];
但没有得到任何富有成果的结果。
要发送数据,使用标准 HAL_CAN_AddTxMessage()
。
HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);
How I can combine all three data type in single CAN message?
乍一看,人们可能会考虑 struct
来保存所有数据然后发送。
// First idea, but is it too big?
typedef struct {
float tf;
uint16_t sl;
bool status_tf;
bool status_sl;
} my_data;
由于填充,my_data
的大小可能超过 8 个字节,bool
可能超过 1 个字节。
考虑使用 memcpy()
来解决对齐问题。一个好的编译器会为这么小的副本发出传出代码。我会将 bool
分配给 charTxData[6]
(& 7) 以应对宽 bool
。只有0或1的值才会赋值。
unsigned char TxData[8];
memcpy(&charTxData[0], &tf, 4);
memcpy(&charTxData[4], &sl, 2);
charTxData[6] = status_tf;
charTxData[7] = status_sl;
HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);
要恢复数据,反向复制。
迂腐的代码也会检查尺寸:
_Static_assert(sizeof tf == 4, "Unusual tf size");
_Static_assert(sizeof sl == 2, "Unusual sl size");
如果 uint16_t
and/or float
或 float
编码的字节顺序可能不同,则需要额外的代码。
在 STM32L4 上使用 CAN 时,我试图发送三种不同的数据类型,即浮点数、布尔值和浮点值。由于在一条消息中可以发送 8 个字节,所以我在一条消息中发送所有三个数据。
我的数据看起来像
float tf;
uint16_t sl;
bool status_tf;
bool status_sl;
如果我能得到一些指导,那就太好了,我如何在单个 CAN 消息中组合所有三种数据类型?
到目前为止,我已经尝试使用 sprintf()
和打印格式说明符。并将组合结果存储在 char TxData[8];
但没有得到任何富有成果的结果。
要发送数据,使用标准 HAL_CAN_AddTxMessage()
。
HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);
How I can combine all three data type in single CAN message?
乍一看,人们可能会考虑 struct
来保存所有数据然后发送。
// First idea, but is it too big?
typedef struct {
float tf;
uint16_t sl;
bool status_tf;
bool status_sl;
} my_data;
由于填充,my_data
的大小可能超过 8 个字节,bool
可能超过 1 个字节。
考虑使用 memcpy()
来解决对齐问题。一个好的编译器会为这么小的副本发出传出代码。我会将 bool
分配给 charTxData[6]
(& 7) 以应对宽 bool
。只有0或1的值才会赋值。
unsigned char TxData[8];
memcpy(&charTxData[0], &tf, 4);
memcpy(&charTxData[4], &sl, 2);
charTxData[6] = status_tf;
charTxData[7] = status_sl;
HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);
要恢复数据,反向复制。
迂腐的代码也会检查尺寸:
_Static_assert(sizeof tf == 4, "Unusual tf size");
_Static_assert(sizeof sl == 2, "Unusual sl size");
如果 uint16_t
and/or float
或 float
编码的字节顺序可能不同,则需要额外的代码。