Микрочип РЧ модулятор выпуск

Я использую пару радиочипов 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. */
Другие вопросы по тегам