Как использовать get_properties для получения RSSI в RF24?

Как использовать get_properties, как показано на рисунке ниже? Я не понимаю < a href="http://community.silabs.com/mgrfq63796/attachments/mgrfq63796/BluetoothandWiFi/8086/1/Si446X%20API%20DESCRIPTIONS.pdf">AN625, как использовать get_properties получить RSSI?

Добавление исходного кода на основе функций RH_RF24.

#include <SPI.h>
#include <RH_RF24.h>

// Одиночный экземпляр радиодрайвера
RH_RF24 rf24;


uint8_t Recieve_Data[20];

uint8_t receive_buffer[RH_RF24_MAX_MESSAGE_LEN];
uint8_t receive_buffer_length = sizeof(receive_buffer);

uint8_t Rssi;

unsigned long Micro_Time;

uint8_t status[8];
uint8_t buf[RH_RF24_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);

void setup()
{
  Serial.begin(115200);
  if (!rf24.init())
    Serial.println("init failed");
  // По умолчанию после инициализации 434,0 МГц, модуляция GFSK_Rb5Fd10, мощность 0x10
   while(!rf24.setFrequency(443));
  rf24.setModemConfig(rf24.GFSK_Rb50Fd100);  // 置成GFSK_Rb50Fd100
}


void loop()
{
  rf24.setModeRx();
  delay(100);
  rf24.setModeIdle();
  rf24.command(RH_RF24_CMD_GET_INT_STATUS, NULL, 0, status, sizeof(status));
  Serial.print("Id   ");
  for (int i = 0; i <= 8; i++)
  {
    Serial.print((uint8_t)status[i]);
    Serial.print("   ");
  }
  Serial.println();
  /*
    if (status[2])
    {
      uint8_t modem_status[6];
      rf24.command(RH_RF24_CMD_GET_MODEM_STATUS, NULL, 0, modem_status, sizeof(modem_status));
      delay(100);
      for (int i = 0; i <= 6; i++)
      {
        Serial.print(modem_status[i]);
        Serial.print("   ");
      }
      Serial.println();
    }
  */
  delay(400);
}

, 👍0

Обсуждение

Какую часть вы используете, так как эта функция доступна только для семейства приемопередатчиков Silicon Labs Si4460/4461/4463/4464 и эквивалентного семейства чипов HopeRF RF24/26/27 и модулей HopeRF RFM24W/26W/27W, @Gerben

@Gerben Я использую Si4463., @lanse7pty

Как указано в ["Github - lora_chisterapi/lib/radiohead/RH_RF24.cpp"](https://github.com/Snootlab/lora_chisterapi/blob/master/lib/radiohead/RH_RF24.cpp), firstProperty = (GROUP << 8) + (START_PROP) и uint8_t* values + uint8_t count используются для сохранения свойств чтения., @J. Piquard

@ J.Piquard Не могли бы вы написать пример, я плохо его понимаю. Кажется, я могу получить RSSI, просто используя команду RH_RF24::, как в сети, которую вы указали., @lanse7pty

Вместо использования command() в качестве статического вызова (RH_RF24::command), лучшим подходом должно быть использование экземпляра класса и объявление RH_RF24 rf24; перед функцией setup() и инициализация экземпляр с вызовом rf24.init(). Итак, не могли бы вы предоставить исходный код, который вы пробовали в своем Arduino, чтобы дать вам более конкретный пример?, @J. Piquard

@J.Piquard J.Piquard Мне очень жаль, я не знаю, как редактировать код, поэтому, хотя я добавил их в свой вопрос, но они неясны., @lanse7pty

@ lanse7pty, я отформатировал добавленный вами исходный код, но дождитесь экспертной оценки. Ваш исходный код кажется хорошим, но будьте осторожны с использованием sizeof(status) в запросе rf24.command() (доступно, только когда размер элемента равен 1 = sizeof(uint8_t)), затем i <= 8 на дисплее цикла for., @J. Piquard


1 ответ


Лучший ответ:

1

Используя RH_RF24 rf24; (экземпляр радиодрайвера для одного экземпляра), чтение набора свойств становится очень простым.

  • Свойства должны находиться в одной и той же ГРУППЕ,
  • В одном запросе можно прочитать до 16 свойств.

Здесь и далее приведен пример чтения из SYNC_CONFIG в SYNC_BITS_7_0 (5 свойства).

Шаг 1. Объявите собственный uint8_t sync_stat[5]; или используйте все еще объявленный uint8_t status[8];. р>

 uint8_t sync_stat[5];

Шаг 2. Фактически, firstProperty — это первое свойство, которое нужно прочитать, а count — количество следующих друг за другом свойств, которые нужно прочитать (из SYNC_CONFIG = 0x1100 на SYNC_BITS_7_0 = 0x1104.

// И проверяем возвращенный код
if (rf24.get_properties(SYNC_CONFIG,sync_stat,5)) {
    // sync_stat[0]= SYNC_CONFIG
    // ...
    // sync_stat[4]= SYNC_BITS_7_0
}

Тогда эквивалентным command() является:

uint8_t buf[3];
buf[0] = SYNC_CONFIG >> 8;
buf[1] = 5;
buf[2] = SYNC_CONFIG & 0xff;
if (rf24.command(RH_RF24_CMD_GET_PROPERTY, buf, sizeof(buf),sync_stat,5)) {
    // Тот же массив
}
,