Массив, который перезаписывает свои значения
- Войдите на сайт для отправки комментариев
Вс, 06/04/2014 - 17:46
Друзья, столкнулся с проблемой. При считывание с 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);
}
}
}
}
У меня есть такое ощущение, что данные с передатчика приходят не все сразу, и по отдельности. Поэтому когда первый байт пришел, записался в нулевую яйчейку, 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(); }} }serial переводится как последовательный, что в целом отражает принцип его работы
Вот же блин... sizeof выдает значение в байтах. Ради интереса выдайте на печать что в результате вашего sizeof получается. Ну и поймете куда сыпятся потнрянные данные. Хоть бы почитали чго.....
Да данные не теряются, они приходят верно, все друг за другом, только пишутся все в одну ячейку. 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();Направление проблемы вы выбрали правильное. Действительно никто не гарантируют что что "все нужные байты пришли сразу". Между ними действительно может быть временная задержка и то что Serial.available() возвращает false не означает "мы приняли все целиком". Это означает "мы приняли все что УСПЕЛО прийти НА ДАННЫЙ МОМЕНТ".
Поэтому вам сначало нужно определится с тем что у вас будет признаком "пакет принят целиком". Что будет отмашкой "пора заканчивать слушать и нужно начинать передавать". Как правило это либо какой-то специмвол в передаваемых данных (например '\n' или '\0') или, если мы заранее знаем сколько байт должно прилетит - смотрим на счетчик принятых байтов. Когда он дошел до "нужного значения" - тогда делаем отсылку.
И сам массив msg[] объявлен немного странновато. Serial.read() вам возвращает byte, а массив у вас из элементов unsigned int. И дальше, судя по msg[i++]='\0' вы предполагаете это "сишная строка", то есть массив char или byte. Вообщем byte[] или char[] было-бы более подходяще.