Отправка 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
@Amr Ahmed, 👍0
Обсуждение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; // это просто увеличивается, чтобы вы могли видеть, что новые данные отправляются
}
теперь он полностью работает с обоими выходами одинакового размера
,
@Amr Ahmed
Смотрите также:
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
вы получаете то, что отправляете. продолжить чтение, @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