Моя цель - реализовать функции для записи сигналов стандартной кадры CAN. Стандарт может кадр содержит следующие сигналы:Бит-начинка при использовании оператора битового поля
- ID: 11 битых
- RTR: 1bit
- reserved_0: 1bit
- reserved_1: 1bit
- АП: 4bit
- данных: 8 байт
Это мое представление к кадру CAN
typedef union
{
unsigned char tab[10];
struct
{
unsigned char id_8_10:3; //ID: bit 8==>10
unsigned char id_4_7:4; //ID: bit 4==>7
unsigned char id_0_3:4; //ID: bit 0==>3
unsigned char rtr:1;
unsigned char reserved0:1;
unsigned char reserved1:1;
unsigned char dlc:4;
unsigned char tabData[8];
}bBit;
}tCanFrame;
И прописывать функции являются следующим:
void IL_Wr_id_8_10(unsigned char ubVal)
{
((tCanFrame*)(&tabFrame))->bBit.id_8_10 = (unsigned int)(ubVal);
}
void IL_Wr_id_4_7(unsigned char ubVal)
{
((tCanFrame*)(&tabFrame))->bBit.id_4_7 = (unsigned int)(ubVal);
}
void IL_Wr_id_0_3(unsigned char ubVal)
{
((tCanFrame*)(&tabFrame))->bBit.id_0_3 = (unsigned int)(ubVal);
}
void IL_Wr_rtr(unsigned char ubVal)
{
((tCanFrame*)(&tabFrame))->bBit.rtr =(ubVal);
}
void IL_Wr_reserved1(unsigned char ubVal)
{
((tCanFrame*)(&tabFrame))->bBit.reserved1 =(ubVal);
}
void IL_Wr_dlc(unsigned char ubVal)
{
((tCanFrame*)(&tabFrame))->bBit.dlc =(ubVal);
}
void IL_Wr_data(unsigned char* ubVal)
{
memcpy(((tCanFrame*)(&tabFrame))->bBit.tabData,ubVal,8);
}
В главном я попытался дать значение сигналов и печатать их, но, к сожалению, кажется, что вещи биты вставляются.
Это главное:
int main()
{
int i;
IL_Wr_id_8_10(0x7);
IL_Wr_id_4_7(0x00);
IL_Wr_id_0_3(0x0F);
IL_Wr_rtr(0x00);
IL_Wr_reserved0(0x0);
IL_Wr_reserved1(0xFF);
IL_Wr_dlc(0x0F);
IL_Wr_data(tableauDonnee);
for (i=0;i<18;i++)
{
printf("Byte %i : %s \n",i,byte_to_binary(tabFrame[i]));
}
return 0;
}
В результате получается следующее:
Byte 0 : 0000.0111 // the result should be Byte 0 : 1000.0111
Byte 1 : 0100.1111 // the result should be Byte 1 : 1110.0111
....
чем проблема, по вашему мнению, и у вас есть какие-либо идеи, чтобы решить эту проблему?
Используйте «пакет» прагму вашего компилятора и убедитесь, что битовые добавить до кратен 8, по крайней мере, и предпочтительно 32 или 64. –