Микрочип РЧ модулятор выпуск
Я использую пару радиочипов MRF24J40, чтобы одна плата микроконтроллера PIC32 могла взаимодействовать с другой посредством радиочастотной передачи. У меня есть весь код для компиляции, но я получаю сообщение об ошибке, связанное с этим кодом.
typedef struct
{
union
{
BYTE Val;
struct
{
BYTE packetType :2; // type of packet. Possible types are
// * PACKET_TYPE_DATA - Data type
// * PACKET_TYPE_COMMAND - Command type
// * PACKET_TYPE_ACK - Acknowledgement type
// * PACKET_TYPE_RESERVE - Reserved type
BYTE broadcast :1; // 1: broadcast, 0: unicast
BYTE secEn :1; // 1: secure the MAC payload, 0: send plain text
BYTE repeat :1; // 1: allow repeaters to forward the message, 0: send message directly
BYTE ackReq :1; // 1: acknowledgement required, 0: no acknowldgement
BYTE destPrsnt :1; // 1: destination address in the packet, 0: destination address not in the packet
BYTE sourcePrsnt :1; // 1: source address in the packet, 0: source address not in the packet
} bits;
} flags;
BYTE * SourceAddress; // Address of the Sender
BYTE * Payload; // Pointer to the payload
BYTE PayloadLen; // Payload size
BYTE RSSIValue; // RSSI value for the received packet
BYTE LQIValue; // LQI value for the received packet
#if defined(IEEE_802_15_4)
BOOL altSourceAddress; // Source address is the alternative network address
WORD_VAL SourcePANID; // PAN ID of the sender
#endif
} MAC_RECEIVED_PACKET;
В основном я попробовал все на свете, чтобы иметь возможность изменять значения переменных packetType
, secEn
, ackReq
и т.д. Я пытался изменить значение непосредственно после их объявлений, но это, похоже, длина в битах, а не значение. В коде (прямо с сайта микрочипа) есть комментарии, в которых говорится, что 1 = это, а 0 = это, но я не нашел нигде, где я мог бы изменить эти значения. Любая помощь от любого, кто знаком с этими чипами MRF24J40 будет принята с благодарностью. Спасибо.
2 ответа
Зависит от того, что вы имеете в виду, когда говорите, что пытались изменить значения.. например, если вы хотите выбрать тип пакета и установить PACKET_TYPE_ACK - тип подтверждения:
MAC_RECEIVED_PACKET myrpacket;
myrpacket.flags.bits.packetType=2;
PackageType может принимать следующие значения:
00 =0 --> PACKET_TYPE_DATA
01 =1 --> PACKET_TYPE_COMMAND
10 =2 --> PACKET_TYPE_ACK
11 =3 --> PACKET_TYPE_RESERVE
Зачем?
биты - это данные BYTE, а packetType - это первые 2 бита этого байта, как объявлено в структуре:
BYTE packetType :2;
так что если вы хотите настроить ackReq
myrpacket.flags.bits.ackReq=1;
надеюсь, это поможет вам
Я не думаю, что это имеет какое-то конкретное отношение к вашему микроконтроллеру, просто вы можете не знать, как struct
а также union
используются для определения битовых полей в C.
MAC_RECEIVED_PACKET
это struct
это поле называется flags
, flags
это union
между BYTE
и struct
битовое поле называется bits
,
В декларации каждое поле в bits
сопровождается его длиной в битах. Таким образом, например, packetType, который составляет 2 бита, может принимать значения 0, 1, 2, 3. Вы устанавливаете значения следующим образом:
MAC_RECEIVED_PACKET foo;
foo.flags.bits.packetType = 3;
foo.flags.bits.secEn = 1;
/* etc. */