Массив, который перезаписывает свои значения

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Друзья, столкнулся с проблемой. При считывание с radio.read данные по идее должны записываться  массив поочереди, но у меня они почему то каждый раз перезаписыватся в нулевую яйчейку! И получается, что в массив записвается только последнее значение в нулевую яйчейку. Как сделать, чтобы с  radio.read они распределялись по всему массиву?

#include <SPI.h>

#include "RF24.h"

int msg[16];
char CODE[16];
int i;
int f;
int p;

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK -> 13

//MISO -> 12

//MOSI -> 11

//CSN -> 10

//CE -> 9

RF24 radio(40,53);


// адреса каналов приема и передачи

const uint64_t pipes[2] = {

0xF0F0F0F000LL, 0xF0F0F0F0FFLL};

void setup(void){
Serial.begin(9600);
radio.begin();

radio.setDataRate(RF24_250KBPS); // Скорость передачи

radio.setChannel(100); // Номер канала от 0 до 127

radio.setRetries(15,15); // Кол-во попыток и время между попытками

radio.openWritingPipe(pipes[0]); // Открываем канал передачи

radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема

radio.startListening(); // Начинаем слушать эфир

}


void loop(){

if (radio.available()){

  bool done = false;

while (!done){

done = radio.read(msg, sizeof(msg));

}


{
  for(i=0; i<16; i++)
  {
switch (msg[i]) {
case 48: CODE[i]=0x00;
case 49: CODE[i]=0x01;
case 50: CODE[i]=0x02;
case 51: CODE[i]=0x03;
case 52: CODE[i]=0x04;
case 53: CODE[i]=0x05;
case 54: CODE[i]=0x06;
case 55: CODE[i]=0x07;
case 56: CODE[i]=0x08;
case 57: CODE[i]=0x09;
case 65: CODE[i]=0x0A;
case 66: CODE[i]=0x0B;
case 67: CODE[i]=0x0C;
case 68: CODE[i]=0x0D;
case 69: CODE[i]=0x0E;
case 70: CODE[i]=0x0F;
}
Serial.println(CODE[i], HEX);
}
}
}
}

 

CEBKACooler
Offline
Зарегистрирован: 14.01.2014


У меня есть такое ощущение, что данные с передатчика приходят не все сразу, и по отдельности. Поэтому когда первый байт пришел, записался в нулевую яйчейку, radio.available() закрывается. Приходит второй байт, radio.available() опять открывается и записывает этот второй байт опять в нулевую ячейку.  

вот код приемника 

#include <SPI.h>

#include "RF24.h"

int toExtract[16];
int i=0;
unsigned int msg[10];
unsigned long mac;
byte par;
String readString;
int x=0;
byte CODE[16];

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK -> 13

//MISO -> 12

//MOSI -> 11

//CSN -> 10

//CE -> 9

RF24 radio(40,53);

// адреса каналов приема и передачи

const uint64_t pipes[2] = {

0xF0F0F0F000LL, 0xF0F0F0F0FFLL};

//кнопки подключены к этим пинам

int buttonPin1 = 7;

int buttonPin2 = 8;

void setup(void){
Serial.begin(9600);
radio.begin();

radio.setDataRate(RF24_250KBPS); // Скорость передачи

radio.setChannel(100); // Номер канала от 0 до 127

radio.setRetries(15,15); // Кол-во попыток и время между попытками

radio.openWritingPipe(pipes[1]); // Открываем канал передачи

radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема

radio.startListening(); // Начинаем слушать эфир

}



void loop(void){


{if (Serial.available() > 0)
{
   for(int i=0; i<8; i++);
  {
    msg[i] = Serial.read();
  }
Serial.println(msg[0], DEC);
radio.stopListening();

radio.write(msg, sizeof(msg[0]));

radio.startListening();
}}

}

 

com
Offline
Зарегистрирован: 06.09.2013

serial переводится как последовательный, что в целом отражает принцип его работы

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Вот же блин... sizeof выдает значение в байтах. Ради интереса выдайте на печать что в результате вашего sizeof получается. Ну и поймете куда сыпятся потнрянные данные. Хоть бы почитали чго.....

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Да данные не теряются, они приходят верно, все друг за другом, только пишутся все в одну ячейку. COM прав, с сериала считывается 1 байт и сразу же его оправляет, и следующий байт уже идет отдельным пакетом, который так же записывается в нудевую ячейку. Я проработал этот момент, но все равно ситуация та же самая. вот код: 

if(Serial.available()>0){
  
{while( Serial.available())
{
    msg[i++] = Serial.read();
 }
 msg[i++]='\0';
 }

//Serial.println(msg[0], DEC);
radio.stopListening();

radio.write(msg, 1);

radio.startListening();

 

leshak
Offline
Зарегистрирован: 29.09.2011

Направление проблемы вы выбрали правильное. Действительно никто не гарантируют что что "все нужные байты пришли сразу". Между ними действительно может быть временная задержка и то что Serial.available() возвращает false не означает "мы приняли все целиком". Это означает "мы приняли все что УСПЕЛО прийти НА ДАННЫЙ МОМЕНТ".

Поэтому вам сначало нужно определится с тем что у вас будет признаком "пакет принят целиком". Что будет отмашкой "пора заканчивать слушать и нужно начинать передавать". Как правило это либо какой-то специмвол в передаваемых данных (например '\n' или '\0') или, если мы заранее знаем сколько байт должно прилетит - смотрим на счетчик принятых байтов. Когда он дошел до "нужного значения" - тогда делаем отсылку.

И сам массив msg[] объявлен немного странновато. Serial.read() вам возвращает byte, а массив у вас из элементов unsigned int. И дальше, судя по msg[i++]='\0' вы предполагаете это "сишная строка", то есть массив char или byte. Вообщем byte[] или char[] было-бы более подходяще.