Я получил функцию, которую мне нужно реализовать в моем коде. Функция работает на собственном тестере.
Вот это со структурой, связанной (я могу сделать исполняемый пример, если необходимо):
#define STEERINGCMD_MSG_BUFFERLENGTH 40
typedef struct GLOBAL_MSG
{
u1 starter;
u1 frameID;
u1 length;
u1 msgData[STEERINGCMD_MSG_BUFFERLENGTH];
u4 CRYPTO;
};
GLOBAL_MSG steeringCmdMsg;
struct SteeringData
{
int isL1;
int isL5;
unsigned long long CoPR;
unsigned long long CoPA;
unsigned long long CaPR;
unsigned long long CaPA;
};
void generateNextSteeringCmdMsg(SteeringData stData)
{
steeringCmdMsg.starter = 0xAA;
steeringCmdMsg.frameID = 68;
steeringCmdMsg.length = STEERINGCMD_MSG_BUFFERLENGTH;
if()
{
steeringCmdMsg.msgData[0] = 0x0F;
}
else if( )
{
steeringCmdMsg.msgData[0] = 0xF0;
}
steeringCmdMsg.msgData[1] = stData.CoPR & 0xFF;
steeringCmdMsg.msgData[2] = stData.CoPR >> 8 & 0xFF;
steeringCmdMsg.msgData[3] = stData.CoPR >> 16 & 0xFF;
steeringCmdMsg.msgData[4] = stData.CoPR >> 24 & 0xFF;
steeringCmdMsg.msgData[5] = stData.CoPR >> 32 & 0xFF;
steeringCmdMsg.msgData[6] = stData.CoPR >> 40 & 0xFF;
steeringCmdMsg.msgData[7] = stData.CoPR >> 48 & 0xFF;
steeringCmdMsg.msgData[8] = stData.CoPR >> 56 & 0xFF;
steeringCmdMsg.msgData[9] = stData.CoPA & 0xFF;
steeringCmdMsg.msgData[10] = stData.CoPA >> 8 & 0xFF;
steeringCmdMsg.msgData[11] = stData.CoPA >> 16 & 0xFF;
steeringCmdMsg.msgData[12] = stData.CoPA >> 24 & 0xFF;
steeringCmdMsg.msgData[13] = stData.CoPA >> 32 & 0xFF;
steeringCmdMsg.msgData[14] = stData.CoPA >> 40 & 0xFF;
steeringCmdMsg.msgData[15] = stData.CoPA >> 48 & 0xFF;
steeringCmdMsg.msgData[16] = stData.CoPA >> 56 & 0xFF;
steeringCmdMsg.msgData[17] = stData.CaPR & 0xFF;
steeringCmdMsg.msgData[18] = stData.CaPR >> 8 & 0xFF;
steeringCmdMsg.msgData[19] = stData.CaPR >> 16 & 0xFF;
steeringCmdMsg.msgData[20] = stData.CaPR >> 24 & 0xFF;
steeringCmdMsg.msgData[21] = stData.CaPR >> 32 & 0xFF;
steeringCmdMsg.msgData[22] = stData.CaPR >> 40 & 0xFF;
steeringCmdMsg.msgData[23] = stData.CaPR >> 48 & 0xFF;
steeringCmdMsg.msgData[24] = stData.CaPR >> 56 & 0xFF;
steeringCmdMsg.msgData[25] = stData.CaPA & 0xFF;
steeringCmdMsg.msgData[26] = stData.CaPA >> 8 & 0xFF;
steeringCmdMsg.msgData[27] = stData.CaPA >> 16 & 0xFF;
steeringCmdMsg.msgData[28] = stData.CaPA >> 24 & 0xFF;
steeringCmdMsg.msgData[29] = stData.CaPA >> 32 & 0xFF;
steeringCmdMsg.msgData[30] = stData.CaPA >> 40 & 0xFF;
steeringCmdMsg.msgData[31] = stData.CaPA >> 48 & 0xFF;
steeringCmdMsg.msgData[32] = stData.CaPA >> 56 & 0xFF;
char* actMsg =(char*) &steeringCmdMsg;
steeringCmdMsg.crc32 = calculateCRYPTOForBuf(actMsg, STEERINGCMD_MSG_BUFFERLENGTH - 4);
}
void getSteeringMsg(i1 msg[STEERINGCMD_MSG_BUFFERLENGTH])
{
char* actMsgData =(char*) &steeringCmdMsg.msgData;
msg[0] = steeringCmdMsg.starter;
msg[1] = steeringCmdMsg.frameID;
msg[2] = steeringCmdMsg.length;
memcpy( &msg[3], actMsgData, STEERINGCMD_MSG_BUFFERLENGTH - 7);
msg[39] = steeringCmdMsg.CRYPTO >>24;
msg[38] = steeringCmdMsg.CRYPTO >>16;
msg[37] = steeringCmdMsg.CRYPTO >>8;
msg[36] = steeringCmdMsg.CRYPTO;
}
//used like this in the main
int main {
i1 tmpMsg[STEERINGCMD_MSG_BUFFERLENGTH + 1];
memset(tmpMsg, 0, STEERINGCMD_MSG_BUFFERLENGTH + 1);
generateNextSteeringCmdMsg(steeringDataL1);
getSteeringMsg(tmpMsg);
write(tmpMsg, STEERINGCMD_MSG_BUFFERLENGTH);
return 0;
}
Контекст: У меня есть оборудование, которое должно получать то, что мы называем «управляющим сообщением» в двоичном формате, которое содержит базовый заголовок и все параметры, содержащиеся в структуре SteeringData. В конце, со всеми параметрами, объединенными в msgData, я вычисляю то, что мы называем CRYPTO. И добавьте его в конец сообщения.
Проблема в том, что в этом коде stData.CoPR / CoPA ... имеют длинную беззнаковую длину (размер = 8), а в моем коде это double (struct.CoPR - и не может быть изменено, поскольку исходит от структура).
Так что я ищу лучший способ изменить эту функцию и заменить это длинное без знака на мою двойную структуру. Либо простое приведение, либо другой способ напрямую перевести мою двойную структуру в массив char. Но я не знаю, где посмотреть и какой самый надежный и безопасный способ сделать это будет 1012 *. 1014 *.
Не стесняйтесь просить больше объяснений, спасибо!