Отправка char через nRF24L01

Я пытаюсь отправить массив символов, используя плату Arduino Uno и модули nRF24L01

Вот код для передатчика и приемника:

 #include <SPI.h> //~ #include <TMRh20nRF24L01.h> //~ #include <TMRh20RF24.h>
 #include <nRF24L01.h>
 #include <RF24.h>
 
 
 #define CE_PIN   9
 #define CSN_PIN 10
 
 // ПРИМЕЧАНИЕ: "LL"; в конце константы стоит "LongLong"; тип //
 These are the IDs of each of the slaves const uint64_t slaveID[2] =
 {0xE8E8F0F0E1LL, 0xE8E8F0F0E2LL} ;
 
 RF24 radio(CE_PIN, CSN_PIN); // Создаем радио
 
 char 
> dataToSend[64]="e7665072be018b6b58ea9e40cf38553d6dc293cda4c9d94cda6e91ca61b3a073";
 
 unsigned long currentMillis; unsigned long prevMillis; unsigned long
> txIntervalMillis = 1000; int txVal = 0; float ackMessg[2]={1,2}; byte
 ackMessgLen = 4; // Обратите внимание, что это 4 — количество байтов в 2 целых числах
 that will be recieved
 
 
 void setup() {
 
    Serial.begin(9600);
     Serial.println("Track Control Starting");
     radio.begin();
     radio.setDataRate( RF24_250KBPS );
     radio.enableAckPayload();
     radio.setRetries(3,5); // задержка, счет }
 
 //=====================
 
 void loop() {
 
     currentMillis = millis();
     if (currentMillis - prevMillis >= txIntervalMillis) {
 
     radio.openWritingPipe(slaveID[0]); // вызывает первый ведомый
                                         // может быть цикл FOR для вызова нескольких ведомых по очереди
    
     bool rslt;
     rslt = radio.write( dataToSend, sizeof(dataToSend) );
     Serial.print("\nRSLT (1 = success) ");
     Serial.println(rslt);
     Serial.print("Data Sent ");
     Serial.print(dataToSend[0]);
     Serial.print("  ");
     Serial.println(dataToSend[1]);
     if ( radio.isAckPayloadAvailable() ) {
         radio.read(ackMessg,ackMessgLen);
        Serial.print("Acknowledge received: ");
        Serial.print(ackMessg[0]);
 #include <SPI.h>
 #include <nRF24L01.h>
 #include <RF24.h>
 
 
 #define CE_PIN   9
 #define CSN_PIN 10
 
 // ПРИМЕЧАНИЕ: "LL"; в конце константы стоит "LongLong"; тип

 const uint64_t   deviceID = 0xE8E8F0F0E1LL; // Определяем ID для этого слейва

int valChange = 1;
 
 RF24 radio(CE_PIN, CSN_PIN);
 
 char  dataReceived[64];
 int ackData[2] = {12,23};
 
 void setup() {
 
     Serial.begin(9600);
     delay(1000);
     Serial.println("Hand Controller Starting");
     radio.begin();
     radio.setDataRate( RF24_250KBPS );
     radio.openReadingPipe(1,deviceID);
     radio.enableAckPayload();
     radio.writeAckPayload(1, ackData, sizeof(ackData));
     radio.startListening();
 }
 
 void loop() {
 
     if ( radio.available() ) {
         radio.read( dataReceived, sizeof(dataReceived) );
          for (int x = 0; x <64; x++) {
       //если (данныеПолучено[x] < 16) {
       // Serial.write('0');
     // }
       Serial.print(dataReceived[x]);}
       Serial.println();
         radio.writeAckPayload(1, ackData, sizeof(ackData));
        
         ackData[0] += valChange; // это просто увеличивается, чтобы вы могли видеть, что новые данные отправляются
     }
}

И вот что я получаю

Запуск ручного контроллера

e7665072be018b6b58ea9e40cf38553d

, 👍0

Обсуждение

вы получаете то, что отправляете. продолжить чтение, @Juraj

да, я знаю, что получил то, что отправил, мой вопрос заключался в том, как получить полный массив символов, поскольку его размер больше, чем размер полезной нагрузки, @Amr Ahmed

Чтобы отправить больший пакет, вам нужно будет разделить данные на последовательность пакетов размера PAYLOAD_MAX (32) у отправителя. А затем собрать данные в приемнике., @Mikael Patel

Я ожидаю, что библиотека отправляет ввод по частям, даже если отправляет один вызов функции. Но я не знаю эту библиотеку. Но получение должно быть закодировано с ожиданием порций данных., @Juraj

да, я пытаюсь найти способ разделить большую полезную нагрузку на куски, @Amr Ahmed

Зачем отправлять 64 символа в шестнадцатеричной системе счисления, если можно отправить 32 байта с теми же данными?, @Mikael Patel

Как я могу это сделать ?, @Amr Ahmed

byte dataToSend[32] = {0xe7, 0x66, 0x50, 0x72,..., 0x61, 0xb3, 0xa0, 0x73}; или напишите функцию, которая преобразует строку символов в вектор байтов, как указано выше., @Mikael Patel

большое спасибо, но массив генерируется из хеш-функции в библиотеке sha256, я просто упростил код здесь, чтобы обсудить концепцию, @Amr Ahmed

Да, SHA256_BLOCK_SIZE равен 32, что соответствует RF24_PAYLOAD_MAX. Размер вектора (64) в вашем примере представляет собой текстовое (символ ASCII) шестнадцатеричное десятичное представление блока. Двойной размер в байте (8 бит) представлен двумя символами ASCII (0..15 отображается в «0»... «9», «A»... «F»)., @Mikael Patel

так могу ли я отправить незакодированный вывод из хеш-функции, а затем отобразить его на стороне получателя?, @Amr Ahmed


1 ответ


1

Код передачи

#include "sha256.h"
#include <Arduino.h>
#include "./printf.h"

#include <SPI.h>
//~ #include <TMRh20nRF24L01.h>
//~ #include <TMRh20RF24.h>
#include <nRF24L01.h>
#include <RF24.h>


#define CE_PIN   9
#define CSN_PIN 10

// ПРИМЕЧАНИЕ: "LL" в конце константы имеет тип "LongLong"
// Это идентификаторы каждого из ведомых устройств
const uint64_t slaveID = 0xE8E8F0F0E1L  ;

RF24 radio(CE_PIN, CSN_PIN); // Создаем радио

unsigned long currentMillis;
unsigned long prevMillis;
unsigned long txIntervalMillis = 1000;
int txVal = 0;
int ackMessg[6];
byte ackMessgLen = 4; 

uint8_t* hash;
uint8_t copy[32];
void printHash(uint8_t* hash) {
  int i;
  for (i=0; i<32; i++) {
    Serial.print("0123456789abcdef"[hash[i]>>4]);
    Serial.print("0123456789abcdef"[hash[i]&0xf]);
      copy[i]=hash[i];
  }
  Serial.println();
}

void setup() {
  printf_begin();

  uint32_t a;
  unsigned long ms;

  Serial.begin(9600);

  radio.begin();
    radio.setDataRate( RF24_2MBPS );
    radio.enableAckPayload();
    radio.setRetries(3,5); // задержка, счет

  // SHA-тесты
  Serial.println("Test: FIPS 180-2 B.1");
  Serial.println("Expect:ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
  Serial.print("Result:");
  ms = micros();
  Sha256.init();
  Sha256.print("abc");
  printHash(Sha256.result());
  Serial.println();
  for(int x=0;x<32;x++)
        {   Serial.print(copy[x]);
            Serial.print(" ");  
                                  }
            Serial.println();

  Serial.print(" Hash took : ");
  Serial.print((micros() - ms));
  Serial.println(" micros");
  Serial.println();

  }


void loop() {

  currentMillis = millis();
    if (currentMillis - prevMillis >= txIntervalMillis) {

    radio.openWritingPipe(slaveID); 
    bool rslt,rsltt;
    rslt = radio.write( copy, 32 );

    if ( radio.isAckPayloadAvailable() ) {
        radio.read(ackMessg,ackMessgLen);
        Serial.print("Acknowledge received: ");
        Serial.print(ackMessg[0]);
        Serial.print("  ");
        Serial.println(ackMessg[1]);
    }
    prevMillis = millis();
 }

}

Код приема

// HandController - слейв или приемник

    // http://tmrh20.github.io/RF24/

    //~ - СОЕДИНЕНИЯ: Модули nRF24L01 См.:
    //~ http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
    //~ 1 - ЗЕМЛЯ
    //~2 - VCC 3,3В!!! НЕ 5В
    //~ 3 — CE к пину 9 Arduino
    //~ 4 — CSN к пину 10 Arduino
    //~ 5 - SCK к контакту 13 Arduino
    //~ 6 - MOSI к контакту 11 Arduino
    //~ 7 — MISO к контакту 12 Arduino
    //~ 8 - НЕ ИСПОЛЬЗУЕТСЯ

#include <SPI.h>
//~ #include <TMRh20nRF24L01.h>
//~ #include <TMRh20RF24.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN   9
#define CSN_PIN 10

// ПРИМЕЧАНИЕ: "LL" в конце константы имеет тип "LongLong"

const uint64_t   deviceID[2] ={ 0xE8E8F0F0E1LL,0xE8E8F0F0E1LL}; // Определяем ID для слейвов

int valChange = 1;

RF24 radio(CE_PIN, CSN_PIN);
RF24 radioo(CE_PIN, CSN_PIN);
uint8_t  dataReceived[32];

int ackData[2] = {12,23};

void setup() {

    Serial.begin(9600);
    Serial.println("Hand Controller Starting");
    radio.begin();
    radio.setDataRate( RF24_2MBPS );
    radio.openReadingPipe(1,deviceID[1]);
    radio.enableAckPayload();
    radio.writeAckPayload(1, ackData, sizeof(ackData));
    radio.startListening();

}

void loop() {

 unsigned long startTimer = millis();

    if ( radio.available() ) {
        radio.read( dataReceived, sizeof(dataReceived) );
        radio.writeAckPayload(1, ackData, sizeof(ackData));
        Serial.println();
        //Serial.println(startTimer);
        Serial.println();
        for(int x=0;x<32;x++)
        {Serial.print(dataReceived[x]);
        Serial.print(" ");}}
        ackData[0] += valChange; // это просто увеличивается, чтобы вы могли видеть, что новые данные отправляются

    }

теперь он полностью работает с обоими выходами одинакового размера

,