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