Вопрос по Char[]

teodor4ik
Offline
Зарегистрирован: 04.11.2013
 if (datacomplete) {
    Serial.print(gpsdata);
    datacomplete = false;
    if (gpsdata.length() > 10){
      int N= gpsdata.indexOf("V,");   
      Serial.println( N, DEC);
      char gpsN[3];
      for (int i=0; i <= 2; i++){
         gpsN[i]=gpsdata[i+N];}
        
      gpsdata = "";
      Serial.println(gpsN);

}
}

$GPRMC,,V,,,,,,,,,,N*53
8
V,,Q

такой кусок кода выдает нечто странное в сериал... если gpsN[3], то почему оно равно V,,Q ?? Ресет не помогает. Понимаю что что-то просрал, но что? Ну и еще вопрос: как проще выдрать кусок строки в другую строку?
П.С. На строку не обращайте внимания. Тут просто не ловит спутники.

maksim
Offline
Зарегистрирован: 12.02.2012

teodor4ik пишет:

такой кусок кода выдает нечто странное в сериал... если gpsN[3], то почему оно равно V,,Q ??

Потому что string

char gpsN[4]  = "   ";

teodor4ik пишет:

как проще выдрать кусок строки в другую строку?

Так же как и сорвать яблоко на яблоню.

А получить подстроку из строки можно так substring().

teodor4ik
Offline
Зарегистрирован: 04.11.2013

maksim пишет:

Потому что string

char gpsN[4]  = "   ";

Ну да, туплю, помогло... в моем случае char gpsN[3] - 2 знака, почему в сериал выпало 6 ? Откуда нарисовалось "Q" и еще 2 непечатки.

 

maksim пишет:

А получить подстроку из строки можно так substring().

тем временем:

http://arduino.cc/en/Tutorial/StringSubstring

It allows you to look for an instance of a particular substring within a given String.

Насколько я понял проверяет вхождение подстроки в строку, не?

 

Все... дошло... Прости, я всю жисть в паскале прожил, а там функции отдельно от процедур :) Тяжело перестроить отработанную годами логику.

 

З.Ы. На русском сайте про стринги: "Текстовые строки в Ардуино объявляются как массив (array) типа char (символов - литер), оканчивающийся символом "конца строки"." явно сообщают что стрнингов не бывает вообще. На англ. они есть, но субстринги не для того...

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

читайте внимательнее

String - это специальный тип, КЛАСС!!! и к стандартной сишной строке, которая является массивом символов char[], не имеет никакого отношения!

maksim
Offline
Зарегистрирован: 12.02.2012

teodor4ik пишет:

почему в сериал выпало 6 ? Откуда нарисовалось "Q" и еще 2 непечатки.

teodor4ik пишет:
 оканчивающийся символом "конца строки".

Так как у вас не было символа конца строки (\0, 0), print() выводил данные до тех пор пока в памяти не встретился тот самый 0.

 

teodor4ik пишет:

Насколько я понял проверяет вхождение подстроки в строку, не?

Попробую ответить в тему - че???

  • string - массив символов
  • String - объект класса
Looka
Offline
Зарегистрирован: 24.04.2012

teodor4ik пишет:

Ну да, туплю, помогло... в моем случае char gpsN[3] - 2 знака, почему в сериал выпало 6 ? Откуда нарисовалось "Q" и еще 2 непечатки.

Размер  массива char  не контроллируется. 

Функция вывода работает пока не встретиться символ \0, который является сиволом окончания строки.

И это уже Ваша задача обеспечить его появление (например как то так chargps[2] = 0;),  это за Вас может сделать любая функция которая выыводит данные в массив, только аккуратно, что бы за определенные пределы не выйти. 

teodor4ik
Offline
Зарегистрирован: 04.11.2013

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

Например:

uno

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define MAX_BUFF 32 //Буфер приёма-передачи  

void setup()

{
   
  Serial.begin(9600);
  Mirf.cePin = 8;
  Mirf.csnPin = 7;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"boat");
  Mirf.setTADDR((byte *)"rc");
  Mirf.payload = MAX_BUFF;
  Mirf.channel = 10;
  Mirf.config();
  char buff[MAX_BUFF];
  } 

void loop()  {
       gpsN[]="123";
       Mirf.send((byte *) gpsN);
}

mega 2560

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define MAX_BUFF 32 //Буфер приёма-передачи  

void setup()

{
  Serial.begin(9600);
  Mirf.cePin = 30;
  Mirf.csnPin = 31;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"rc");
  Mirf.setTADDR((byte *)"boat");
  Mirf.payload = MAX_BUFF;
  Mirf.channel = 10;
  Mirf.config();
} 

void loop()

{
 byte rfdata[Mirf.payload];
  if(Mirf.dataReady()){
  Serial.println("Got packet");
  Mirf.getData(rfdata);
  Serial.println((char *)rfdata);} 

}

И тишина... Не передал? Не принял? Код? Настройка? Неконтакт? Криво собрал?

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

teodor4ik пишет:

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

вы мазохист? :)

maksim
Offline
Зарегистрирован: 12.02.2012

Используйте другую библтотеку для работы с nRF24L01.

Looka
Offline
Зарегистрирован: 24.04.2012

maksim пишет:

Используйте другую библтотеку для работы с nRF24L01.

Не думаю что дело в библиотеке.

Вы 3 вольта для питания нрф откуда берете? 

Начните с другого примера, для одного дивайся, типа сканера, если не ошибаюсь в примерах должен быть.

ну и как включаете, мегу?

teodor4ik
Offline
Зарегистрирован: 04.11.2013

если можна, ссыль?

Эта попалась первой на глаза у продавца плат на страничке.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Looka пишет:

Не думаю что дело в библиотеке.

Вы 3 вольта для питания нрф откуда берете? 

Начните с другого примера, для одного дивайся, типа сканера, если не ошибаюсь в примерах должен быть.

ну и как включаете, мегу?

3 вольта с 3.3 ардуин.

Пример однажды завелся, больше не хочет :))) там как раз на 2 девайса пинг.

мега 30,31 50,51,52 :) спай-разъем прячется под ЛСД шилдом.

Looka
Offline
Зарегистрирован: 24.04.2012

Попробуйте на внешнем питании, в первую очередь для меги. 

Сканер нашли? Работает на обоих девайсах?

 

Буквально вчера сам с этим разбирался, любопытно заработало (пинги пошли) когда. Брал в руки антенки нрф...

правда на другой библиотеке

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Питание не при делах... только что залил пинг из примеров. Бегает красиво. НО! В сериал выдает данные только если мегу ресетнуть после того как открыть монитор порта. Странно, да?

Нрф с усилками и внешними антеннами. Так что ваш финт не пройдет. А вообще где-то тут вспоминали что бывают кривые платы, плохо пропаянные, которые работают зависимо от положения или прижима кварца/прогиба.

Looka
Offline
Зарегистрирован: 24.04.2012

По поводу Ваших первых скетчей, для уно и меги.

Проверил на уно и диамолове, работают.

Только надо закаментировать 16-ые строки в обоих скечах,  и во втором добавить в loop() задержку, например  delay( 100 ) 

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Looka пишет:

По поводу Ваших первых скетчей, для уно и меги.

Проверил на уно и диамолове, работают.

Только надо закаментировать 16-ые строки в обоих скечах,  и во втором добавить в loop() задержку, например  delay( 100 ) 

Не помогло... Каментить именно 16е строки?

Если можна уточнить, а зачем их каментить? они же вроде задают адреса получателя/отправителя. Можна валить в эфир кому попало?

 

А теперь насчет задержки - проверка if (mirf.dataready()) разве не для того? А асли добавить проверку типа if (millis - time)

Looka
Offline
Зарегистрирован: 24.04.2012

Зачем - надо в библитеках покопаться. 

if (mirf.dataready())   -  задержку не заменяет, проблема думаю в частом обращении к модулю, не нравится ей слишком частое дерганье. 

А заменить delay()   на  if (millis - time)  конечно можно.

А по номерам строк -  вот собственно код.....

 

Цитата:
[color=#7E7E7E]//  DIAMALANOVE[/color] #include <[color=#CC6600]SPI[/color].h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h> #define MAX_BUFF 32 [color=#7E7E7E]//Буфер приёма-передачи&nbsp; [/color] [color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]() {  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]begin[/color](57600);  Mirf.cePin  = 9;  [color=#7E7E7E]//30;[/color]  Mirf.csnPin = 10; [color=#7E7E7E]//31;[/color]  Mirf.spi = &MirfHardwareSpi;  Mirf.[color=#CC6600]init[/color]();  Mirf.setRADDR(([color=#CC6600]byte[/color] *)[color=#006699]"rc"[/color]);  [color=#7E7E7E]//Mirf.setTADDR((byte *)"boat");[/color]  Mirf.payload = MAX_BUFF;  Mirf.channel = 10;  Mirf.[color=#CC6600]config[/color](); }  [color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]() {  [color=#CC6600]byte[/color] rfdata[Mirf.payload]; [color=#CC6600]if[/color](Mirf.dataReady()) {   [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"Got packet"[/color]);   Mirf.getData(rfdata);   [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color](([color=#CC6600]char[/color] *)rfdata); }  }

 

// UNO

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define MAX_BUFF 32 //Буфер приёма-передачи&nbsp; 

void setup()

{
 Serial.begin(57600);
 Mirf.cePin = 9; //8;
 Mirf.csnPin = 10; //7;
 Mirf.spi = &MirfHardwareSpi;
 Mirf.init();
 //Mirf.setRADDR((byte *)"boat");
 Mirf.setTADDR((byte *)"rc");
 Mirf.payload = MAX_BUFF;
 Mirf.channel = 10;
 Mirf.config();
 char buff[MAX_BUFF];
} 

void loop()
{
char gpsN[]="123";
Mirf.send((byte *) gpsN);
delay( 50 );

}

 

 

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Эффект приинтереснейший... если дергать ресетом Уно, то через раз приходит пара пакетов. Потом все глохнет навсегда. Значения делея не играют роли. Уно при этом моргает Тх-ом (тоесть не висит). При удачной отправке за каким то лешим моргает Rx. Чую что где-то бок... Тестовый пинг, то проходит нормально.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Looka пишет:

if (mirf.dataready())   -  задержку не заменяет, проблема думаю в частом обращении к модулю, не нравится ей

Не должно бы... оно кабы 2мбита дежит, такша по 256 бит должно 8192 раза пережить :)

teodor4ik
Offline
Зарегистрирован: 04.11.2013

чем дальше в лес, тем третий лишний... Тот же скетч при установке уно - передатчиком, мегу - приемником глюкает. Наоборот все отлично... Сами радейки менял местами. Нифига, это не они... Проблемы с питаловом на меге наоборот должны бы быть в режиме передатчика... короче ХЗ..