Извлечение данных из PROGMEM.

croan
Offline
Зарегистрирован: 21.02.2018

Здравствуйте.

Пытаюсь написать скетч простейшего устройства контроля доступа выполненного на плате Arduino Uno и считывателе RDM6300.

В сети есть готовые скетчи, но т.к. метки у меня не перезаписываемые и их порядка 100 штук вида:

"25049484852546652515269553"

"25049484852557049576648673"

"25049484852555467704870653"

Приходится переделывать доступные скетчи под свои потребности.

Суть проблемы состоит в том что 100 меток приведенного размера просто не влезают в RAM память, для чего на форуме мне посоветовали обрезать инвариативную часть меток и запихать их в PROGMEM. С этой задачей справился довольно легко :

const uint64_t PROGMEM  Str[] = { 65253555453653 , 46654545166503 , 64853535451653 };

#include <SoftwareSerial.h>
#include <avr/pgmspace.h>

// Подключаем сам ридер
SoftwareSerial RfidReader(8, 9);
String s; 
String data1;
bool ok = false;
bool reads = false;
// активируемый порт при считывании валидной карты
int yes = 6;
// активируемый порт при считывании карты не из списка
int no = 7;
 
// Массив с номерами карт. Для увеличения валидных карт просто добавьте еще один массив внутрь

const uint64_t PROGMEM  Str[] = { 65253555453653 , 46654545166503 , 64853535451653 };

char newtag[] = {"00000000000000000000000000"}; 
 
void setup(){
 RfidReader.begin(9600);
 Serial.begin(9600); 
 pinMode(yes, OUTPUT); 
 pinMode(no, OUTPUT);
}
// данная функция сравнивает по очереди все 14 символов
// массива из базового массива, и только что считанного массива


 
void loop(){
  char buffer[1];
 //reads = ok = false;
 // если карта поднесена
 if (RfidReader.available() > 0) {
    // создаем массив с данными поднесенной карты
   for (int x = 0 ; x < 14 ; x++){
   data1 = RfidReader.read();
   s+=data1;
   while (RfidReader.available())
   break; 
 
  }
    
    if (s.length()==26) {
         // выводим данные
    Serial.println("yes");
   strcpy_P(buffer, (PGM_P)pgm_read_word(&(Str[0])));
      Serial.println(buffer);  
    
/*   Код проверки валидности карт пока отключил 

while (RfidReader.read() > 0) {};
    for (int i = 0 ; i < 1 ; i++){
      strcpy_P(buffer, (PGM_P)pgm_read_word(&(Str[10])));
      Serial.println(buffer);
    if (s==buffer){
    digitalWrite(yes, HIGH);
   delay(4000);
   digitalWrite(yes, LOW);
   s="";
     }
    }*/
    }
  
    else {
    Serial.println(s);
    s="";
    }
    
}

}

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

 

croan
Offline
Зарегистрирован: 21.02.2018

А вот с извлечением из PROGMEM никак не могу разобраться. То что накопал в сети на данный момент не работает:

char buffer[];

strcpy_P(buffer, (PGM_P)pgm_read_word(&(Str[])));

 Serial.println(buffer);

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Как же он будет работать, если ваш массив uint64_t, а пример для строк?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

croan, word - это два байта, а uint64-t - 8 байтов. Как же оно будет работать, если из восьми байтов Вы читаете только два?

 

В какой степени Ардуино поддерживает uint64-t, я не знаю (и разбираться мне лично неинтересно), но коль скоро на выходе нужна строка, а не число, я повторю рекомендацию: вместо десятичного использовать двоично-десятичное представление, т.е. вместо

const uint64_t PROGMEM  Str[] = { 65253555453653 , 46654545166503 , 64853535451653 };

писать

const uint64_t PROGMEM  Str[] = { 0x65253555453653 ,0x46654545166503 , 0x64853535451653 };

а в процессе работы читать побайтно и сразу считанный байт преобразовывать в два симворла строки, т. 0x65 - в "65", 0x25 - в "25" и т.д. Должно получиться быстре и компактнее (только строку придетя заполнять с конца, т.к. в Ардуино числа хранятся, начиная с младшего байта).

sadman41
Offline
Зарегистрирован: 19.10.2016

andriano пишет:

croan, word - это два байта, а uint64-t - 8 байтов. Как же оно будет работать, если из восьми байтов Вы читаете только два?

Да он вообще не число считывает, а пытается копировать некую строку, которая лежит по адресу, определяемому первыми двумя байтами элемента (элементов) его uint64_t массива. Я даже не знаю, к чему это может привести. Разве что к двойному зависанию.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Да он вообще не число считывает, а пытается копировать некую строку, которая лежит по адресу, определяемому первыми двумя байтами элемента (элементов) его uint64_t массива. Я даже не знаю, к чему это может привести. Разве что к двойному зависанию.

Посмотрел внимательнее.

Т.к. число 14-значное, старший байт наверняка нулевой. Так что копировать функцией для С-строки как раз можно. (по крайней мере, в этом месте зависания не будет) Только, конечно, надо сначала обнулить буфер числа, а потом работать с ним как с числом, а не как со строкой.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:
к двойному зависанию.
Это как?

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41 пишет:
к двойному зависанию.
Это как?

Профессиональный юмор.

Это созданная пользователем ситуация, в которой не помогает не только штатный reset, но и все обычные действия, которые предпринимает обслуживающий персонал. Причем сам пользователь не может объяснить как он этого добился, но легко повторяет это через какое-то время.

Ну вот, к примеру, когда некто кормит atol() массивами, а потом у него ардуина шиться перестает. Или что-то в этом роде.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
const char Str[][7] PROGMEM = {
  {65, 25, 35, 55, 45, 36, 53}, /*65253555453653*/
  {46, 65, 45, 45, 16, 65, 03}, /*46654545166503*/
  {64, 85, 35, 35, 45, 16, 53} /*64853535451653*/
};
void setup() {
  Serial.begin(9600);
  int num;
  for (int i = 0; i < 3; ++i) {
    Serial.println();
    for (int j = 0; j < 7; ++j) {
      num = pgm_read_byte(&Str[i][j]);
      Serial.print(num);
      Serial.print(" ");
    }
  }
}

void loop() {

}
/*Скетч использует 1664 байт (5%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 188 байт (9%) динамической памяти, оставляя 1860 байт для локальных переменных. Максимум: 2048 байт.
*/

 

croan
Offline
Зарегистрирован: 21.02.2018

sadman41 пишет:

Как же он будет работать, если ваш массив uint64_t, а пример для строк?

так вот я и спрашивал как считывать uint64_t из PROGMEM )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Байт считать можете? Ну и читайте его побайтно - восемь байтов.

croan
Offline
Зарегистрирован: 21.02.2018

andriano пишет:

croan, word - это два байта, а uint64-t - 8 байтов. Как же оно будет работать, если из восьми байтов Вы читаете только два?

 

В какой степени Ардуино поддерживает uint64-t, я не знаю (и разбираться мне лично неинтересно), но коль скоро на выходе нужна строка, а не число, я повторю рекомендацию: вместо десятичного использовать двоично-десятичное представление, т.е. вместо

const uint64_t PROGMEM  Str[] = { 65253555453653 , 46654545166503 , 64853535451653 };

писать

const uint64_t PROGMEM  Str[] = { 0x65253555453653 ,0x46654545166503 , 0x64853535451653 };

а в процессе работы читать побайтно и сразу считанный байт преобразовывать в два симворла строки, т. 0x65 - в "65", 0x25 - в "25" и т.д. Должно получиться быстре и компактнее (только строку придетя заполнять с конца, т.к. в Ардуино числа хранятся, начиная с младшего байта).

видимо придется использовать переделываемый вариант, т.к. он проще - там изначально номер метки разбивается по два числа. я думал что может быть есть наименее трудоемкий способ занесения 100 меток в базу(каждую метку надо делить на пары и разделять запятыми). да и интересен был процесс реализации этой задачи. но по всей видимости целиком число не получится использовать - нужны танцы с бубном)

croan
Offline
Зарегистрирован: 21.02.2018

в первозданном варианте(скетч прикреплен) как раз и был такой вариант. но без внесения в progmem 

#include <SoftwareSerial.h>
 
// Подключаем сам ридер
SoftwareSerial RfidReader(8, 9);
 
int data1 = 0;
bool ok = false;
bool reads = false;
// активируемый порт при считывании валидной карты
int yes = 6;
// активируемый порт при считывании карты не из списка
int no = 7;
 
// Массив с номерами карт. Для увеличения валидных карт просто добавьте еще один массив внутрь
int tags[][14] = {
 {2, 50, 49, 48, 48, 53, 48, 48, 56, 53, 56, 50, 49, 3 },
 {25049484853484856535650493  }
 // просто добавьте сюда еще строки - например {2, 49, 54, 48, 48, 49, 69, 55, 50, 56, 55, 70, 68, 3 }
};
int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 
 
void setup(){
 RfidReader.begin(9600);
 Serial.begin(9600); 
 pinMode(yes, OUTPUT); 
 pinMode(no, OUTPUT);
}
// данная функция сравнивает по очереди все 14 символов
// массива из базового массива, и только что считанного массива
uint8_t compare(int str1[], int str2[]) 
{ 
    for(uint8_t i = 0; i < 14; i++) 
    { 
        if(str1[i] != str2[i]) return 0; 
    } 
    return 1; 
} 
 
void loop(){
 reads = ok = false;
 // если карта поднесена
 if (RfidReader.available() > 0) {
  delay(100);
  // создаем массив с данными поднесенной карты
  for (int x = 0 ; x < 14 ; x++){
   data1 = RfidReader.read();
   newtag[x] = data1;
  }
   //пока еще какая-то карта доступна 
  while (RfidReader.available()) 
    // все непустые байты считываем вникуда (всё что надо, считали выше)))) 
    while (RfidReader.read() > 0) {};
  reads = true;
  // по очереди сравниваем данные карты с валидным массивом
  for(int i = 0; i < sizeof(tags) ; i++){
   if (compare(newtag, tags[i]) == true){
    ok = true;
    break;
   }
  }
 }
 // если произошло считывание
 if(reads){
  // если карта есть в списке валидных
  if (ok){
   digitalWrite(yes, HIGH);
   delay(2000);
   digitalWrite(yes, LOW);
  }
  // если карт нету в списке валидных
  else {
   digitalWrite(no, HIGH);
   delay(2000);
   digitalWrite(no, LOW);
  }
  ok = false;
 }
}

 

croan
Offline
Зарегистрирован: 21.02.2018

qwone пишет:

/**/
const char Str[][7] PROGMEM = {
  {65, 25, 35, 55, 45, 36, 53}, /*65253555453653*/
  {46, 65, 45, 45, 16, 65, 03}, /*46654545166503*/
  {64, 85, 35, 35, 45, 16, 53} /*64853535451653*/
};
void setup() {
  Serial.begin(9600);
  int num;
  for (int i = 0; i < 3; ++i) {
    Serial.println();
    for (int j = 0; j < 7; ++j) {
      num = pgm_read_byte(&Str[i][j]);
      Serial.print(num);
      Serial.print(" ");
    }
  }
}

void loop() {

}
/*Скетч использует 1664 байт (5%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 188 байт (9%) динамической памяти, оставляя 1860 байт для локальных переменных. Максимум: 2048 байт.
*/

 

спасибо, пример хороший, но как раз от разделения запятыми я и пытался уйти) видимо никак))

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот вариант, например:

const uint64_t PROGMEM  ID[] = { 65253555453653 , 46654545166503 , 64853535451653 };

void setup() {
  Serial.begin(9600);
  uint64_t storedID = 0;
  uint64_t readedID = 46654545166503;
  uint8_t n = 1;

  memcpy_P((uint8_t*) &storedID, &ID[n], sizeof(storedID));

  if (storedID == readedID) {
     Serial.println("The same ID"); 
  } else {
     Serial.println("Wrong ID");   
  }
 }

void loop() {}
 
croan
Offline
Зарегистрирован: 21.02.2018

sadman41 пишет:

Вот вариант, например:


  memcpy_P((uint8_t*) &storedID, &ID[n], sizeof(storedID));

 

немного не понятно это выражение, но спасибо, буду разбираться)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

croan пишет:
как раз от разделения запятыми я и пытался уйти
А чем запятые Вам мешают в исходном коде? Они же в прогмем не идут.

b707
Offline
Зарегистрирован: 26.05.2017

croan, вам в том топике предложили несколько вариантов решения. в том числе самый очевидный - просто положить ваши метки в PROGMEM в виде строк, без всяких преобразований. С вашими знаниями не стоит лезть  в uint64_t  или двоично-десятичное представление. В виде строк во флеше легко поместится даже не 100 меток. а раз в пять больше

croan
Offline
Зарегистрирован: 21.02.2018

сотню меток разделять запятыми ручками) хотел по-научному))

croan
Offline
Зарегистрирован: 21.02.2018

b707 пишет:

croan, вам в том топике предложили несколько вариантов решения. в том числе самый очевидный - просто положить ваши метки в PROGMEM в виде строк, без всяких преобразований. С вашими знаниями не стоит лезть  в uint64_t  или двоично-десятичное представление. В виде строк во флеше легко поместится даже не 100 меток. а раз в пять больше

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

b707
Offline
Зарегистрирован: 26.05.2017

croan пишет:

сотню меток разделять запятыми ручками) хотел по-научному))

такаие вещи делаются не вручную, а отдельной программой.

croan
Offline
Зарегистрирован: 21.02.2018

b707 пишет:

croan пишет:

сотню меток разделять запятыми ручками) хотел по-научному))

такаие вещи делаются не вручную, а отдельной программой.

про существование оной не знал)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

croan пишет:

про существование оной не знал)

Попал b707!!! Рассказывайте теперь где оную скачать или какое видео посмотреть.

sadman41
Offline
Зарегистрирован: 19.10.2016

На cpan.org, вестимо...

b707
Offline
Зарегистрирован: 26.05.2017

croan пишет:

вытягивание строк из progmemа я вообще не смог найти.

плохо искали, даже в букваре Ардуино пример есть https://www.arduino.cc/reference/en/language/variables/utilities/progmem/

см второй раздел -  "Array of strings"

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Попал b707!!! Рассказывайте теперь где оную скачать или какое видео посмотреть.

даже не подумаю (без смайла)

b707
Offline
Зарегистрирован: 26.05.2017

croan. я зря влез - вижу sadman в #14 вам уже готовый код предложил под uint64_t - пользуйтесь и не забивайте мозг

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

не забивайте мозг

Хренушки! Сегодня день такой - 11-ый лунный, вторая фаза, опять же Луна в созвездии Рака. В общем, "Луна стала Раком на Весы".

Вон соседняя тема такая же :(

croan
Offline
Зарегистрирован: 21.02.2018

b707 пишет:

croan пишет:

вытягивание строк из progmemа я вообще не смог найти.

плохо искали, даже в букваре Ардуино пример есть https://www.arduino.cc/reference/en/language/variables/utilities/progmem/

см второй раздел -  "Array of strings"

вот как раз с оной и стянул 

strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy. Serial.println(buffer);

а для меня как для новичка не совсем понятно что там и откуда... ибо подробного описалова нет. дешифруете надпись (char*)pgm_read_word(&(string_table[i])) - буду очень вам благодарен)

croan
Offline
Зарегистрирован: 21.02.2018

блин, ребятыыыы... я прекрасно понимаю что у новичков бывают реально тупые вопросы из-за незнания предмета. и что некоторых эта "тупость" раздражает. но терпимее что ли надо быть. некоторые очевидные для вас вещи совершенно не очевидны для новичков. потому и создаются бесконечно бестолковые темы на форумах. и ничего с этим не поделать. 

взять, к примеру, строку strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i])));

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Вас в школе учили разбирать предложение на подлежащее, сказуемое там... ?

Попробуйте применить тот же самый способ и разбить непонятную вам строку на части, да потом каждую обмозговать. Мы же тут не работаем преподавателями/репетиторами за зарплату от государства. 

Были у меня свободное время и интерес к uint64_t - я поковырялся и кодом продемонстрировал как вытаскивается и сравнивается число. Полдня на объяснения я себе не могу позволить. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

croan пишет:

но расшифровки содержимого я так и не смог найти (по-крайней мере на понятном мне русском языке),

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

Если у Вас тот случай, то и пользуйтесь как "беременная доярка" - мигайте светодиодом, ставьте готовые скетчи из примеров и радуйтесь жизни, получайте удовольствие. Какой нахрен прогмем? Вы видели домохозяйку, которая слышала такое слова и точно уверена, что к минету это не имеет никакого отношения?

Если же хотите понимать что там написано и писать самому, то придётся становиться программистом. Вот Вам описание всего, что есть в этой строке на русском языке. Читайте. Изучайте.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#14  Скетч неплохой. Особенно если скрестить со структурами или классом. И да согласен. Объянять людям что и как это на пол дня тупой и бесполезной писанины. Все уже открыто до нас. И незачем жевать эту кашу снова.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

croan пишет:

b707 пишет:

croan пишет:

сотню меток разделять запятыми ручками) хотел по-научному))

такаие вещи делаются не вручную, а отдельной программой.

про существование оной не знал)

Узнаете, когда напишете эту программу сами.

 

По моему опыту, при составлении более или менее серьезной программы для Ардуино, приходится писать в несколько раз больше кода для ПК. Программы для ПК, как правило, служат для подготовки массивор констант, которые затем будет использовать Ардуино в своей работе.

Вам предлагается написать простейшую программу по обработке текста - которая вставляет запятую после каждых двух цифр. Это совершенно обычная практика.

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Вас в школе учили разбирать предложение на подлежащее, сказуемое там... ?

Как же, как же, как сейчас помню: девочка это подлежащее, мальчик надлежащее, а пошли в лес за грибами, это предлог.))))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

bwn, хотя бы так. А то получается . Группа подростков поперлась в лес. Там набухались, кто кого драл неизвестно, и какая была оринтация до и после неизвестно. Кто будет отвечать за последствие тоже неизвестно.  Что, то же открывать тему на соотвествующем форуме? :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

Что, то же открывать тему 

А то!

croan
Offline
Зарегистрирован: 21.02.2018

на пол дня тролить новичков время находится, а объяснять - нет))) 

нах вообще лезть в темы, в которых кроме стёба и глума ничего не пишете ?

я просто не могу вашей логики понять: залез чел на форум с вопросом, залез потому что не понимает предмета. вот пытается но не понимает. и, обращаю внимание, не просит готовый код а хочет сам разобраться. кто-то дельные советы дает(за что спасибо огромное), а кто-то через губу не переплюнет чтобы что-то полезное сказать, а только шлак всякий изрыгает. так вот, обращаюсь к таким умникам, которые знают, но не помогают - пшли вон из моей темы. создавайте свои и стебитесь там над кем хотите. я здесь по делу и у меня нет времени читать вашу скверну. кто помогает - еще раз огромное спасибо!

croan
Offline
Зарегистрирован: 21.02.2018

забываете вы , что тут не все занимаются программированием. 

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

в, садясь за руль автомобиля, и зная как в экстренной ситуации поменять колесо врядли захотите изучать процесс литья или штамповки оного. 

sadman41
Offline
Зарегистрирован: 19.10.2016

croan пишет:

в, садясь за руль автомобиля, и зная как в экстренной ситуации поменять колесо врядли захотите изучать процесс литья или штамповки оного. 

Верно. Но при этом вы садитесь в автомобиль, купленный у тех, кто понимает в процессах литья и штамповки.

В данном случае вы прибегаете на завод, говорите: "делаю свой автомобиль! Объясните, как подкидывать антрацит в топку! Времени изучать металловедение нет, хочу за руль!"

croan
Offline
Зарегистрирован: 21.02.2018

sadman41 пишет:

croan пишет:

в, садясь за руль автомобиля, и зная как в экстренной ситуации поменять колесо врядли захотите изучать процесс литья или штамповки оного. 

Верно. Но при этом вы садитесь в автомобиль, купленный у тех, кто понимает в процессах литья и штамповки.

В данном случае вы прибегаете на завод, говорите: "делаю свой автомобиль! Объясните, как подкидывать антрацит в топку! Времени изучать металловедение нет, хочу за руль!"

вижу это иначе) а именно - если мне интересно как работает двигатель - я могу попытаться понять это и , возможно, данное знание мне пригодится в эксплуатации автомобиля.но создавать предприятие по производству движков(эквивалентно предложению разработать программу по установке запятых) для понимания работы двигателя вовсе необязательно. так и со скетчем: мне интересно как он работает и я хочу его доработать под свои нужды (ну нет у меня в селе 95 бензина, а есть только газ) .

а изображать из себя гаражных умельцев которые пацанов с ведром заставляют искать компрессию - много ума не надо. ибо ума этого не видно, даже если он и есть. 

вот так и здесь - дохрена пишем, дохрена умничаем, а объяснить пацану что такое компрессия - западло) 

вот и бегаю я с ведром ищу эту компрессию. 

разбираю строку по словам и гуглю каждое. посмотрим что из этого получится...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

croan пишет:
объяснить пацану что такое компрессия - западло)
Да, нет, просто пацану западло слушать что такое компрессия - ему сразу подавай регулировку движка с оптимизацией по расходу.

Я Вам в #31 дал ссылку, где всё написано, но Вы же не читатель. Вы приходите сюда и требуете, чтобы эту же книгу Вам кто-то прямо сюда перевколотил. Зачем? Читайте там.

P.S. Если Вы считаете, что для понимания что написано в программе, Вам не нужна вся книга - то ошибаетесь. Без базовых знаний Вы нихрена не поймёте, а там именно базовые знания.

Так что, если Вы и впрямь хотите что-то понять, то завязывайте хамить, берите книгу и не возвращайтесь пока всё не прочитаете и не разберёте все приведённые там примеры.

А то несетё тут какую-то ахинею ...

croan пишет:

забываете вы , что тут не все занимаются программированием. 

Все. Потому что без программирования сделать что-то на микроконтроллере невозможно. Если Вы хотите получить готовое изделие без программирования, то либо купите его, либо закажите работу программисту. По-другому не бывает.

croan
Offline
Зарегистрирован: 21.02.2018

ЕвгенийП пишет:

croan пишет:
объяснить пацану что такое компрессия - западло)
Да, нет, просто пацану западло слушать что такое компрессия - ему сразу подавай регулировку движка с оптимизацией по расходу.

Я Вам в #31 дал ссылку, где всё написано, но Вы же не читатель. Вы приходите сюда и требуете, чтобы эту же книгу Вам кто-то прямо сюда перевколотил. Зачем? Читайте там.

P.S. Если Вы считаете, что для понимания что написано в программе, Вам не нужна вся книга - то ошибаетесь. Без базовых знаний Вы нихрена не поймёте, а там именно базовые знания.

Так что, если Вы и впрямь хотите что-то понять, то завязывайте хамить, берите книгу и не возвращайтесь пока всё не прочитаете и не разберёте все приведённые там примеры.

А то несетё тут какую-то ахинею ...

croan пишет:

забываете вы , что тут не все занимаются программированием. 

Все. Потому что без программирования сделать что-то на микроконтроллере невозможно. Если Вы хотите получить готовое изделие без программирования, то либо купите его, либо закажите работу программисту. По-другому не бывает.

не хамлю я. бесят умники, которые на вопрос "что это значит" отвечают "иди в библиотеку"))

кстати ссылку в посте 31 я заметил после этого вашего сообщения ибо не дочитал до конца весь пост, т.к. домохозяйки,минет показались мне не очень близкими к обсуждаемой теме))) а оказывается надо было дочитать, ведь где-то между домохозяйкой и минетом таился ответ на вопрос - "иди в библиотеку"))) 

но все равно спасибо. почитаемс...

 

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

Если же хотите понимать что там написано и писать самому, то придётся становиться программистом. Вот Вам описание всего, что есть в этой строке на русском языке. Читайте. Изучайте.

Евгений, между вторым и четвертым изданием есть глобальная разница, не в курсе? Сподвигли меня жабу прихлопнуть, а вот разница в цене между ними аж пятьсот рупий, хотя формат и страниц почти одинаково.

sadman41
Offline
Зарегистрирован: 19.10.2016

bwn пишет:

Евгений, между вторым и четвертым изданием есть глобальная разница, не в курсе? Сподвигли меня жабу прихлопнуть, а вот разница в цене между ними аж пятьсот рупий, хотя формат и страниц почти одинаково.

Вес проверяли? Грибы придавливать ежели - надо потяжельше выбирать...

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Вес проверяли? Грибы придавливать ежели - надо потяжельше выбирать...

Неа, вес нам без надобности, а Евгений к толмудам поближе стоит, может в курсах. По фотографии фасада разницы не видно.))))

b707
Offline
Зарегистрирован: 26.05.2017

croan пишет:

вот как раз с оной и стянул 

strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy. Serial.println(buffer);

а для меня как для новичка не совсем понятно что там и откуда... ибо подробного описалова нет. дешифруете надпись (char*)pgm_read_word(&(string_table[i])) - буду очень вам благодарен)

croan

Тема про строки в ПРОГМЕМ всплывает на форуме каждый месяц по три раза. Почти каждый из местных гуру обьяснил ее новичкам по нескольку раз - ну надоело уже жевать одно и то же, тем более что каждый новичок считает свою тему уникальной и обижается, когда его "посылают в библиотеку".

Даю вам ссылку на тему. где все. что вы спрашиваете, подробно разжевано. Особенно обратите внимание на сообщение #23 от ЕвгенияП

http://arduino.ru/forum/programmirovanie/ocherednoi-raz-progmem

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); 

string_table[i] /*i-итый элемент char массива string_table*/
&string_table[i]/*прочитать адрес i-итого элемента ....*/
pgm_read_word(&(string_table[i])) /*прочитать usigned int из прогмема по адресу...*/
(char*)pgm_read_word(&(string_table[i])) /*преобразрвать в указатель shar переменную usigned int ...*/
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); /*скопировать в char массив buffer из переменных расположеных по указателю...*/

croan, вам сразу понятно стало! Терминов вы не знаете. А без терминов как объяснят . Это делает это, потому что это....  Бред.

И еще Посмотрите Дом который построил Джек https://www.youtube.com/watch?v=cZf8Ynf5WoU

Вот в СИ это сплошняком. А новички это не переваривают. Потому что они не хотят быть программистами а хотят быть халявщиками.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

croan пишет:
ибо не дочитал до конца
да, я уж понял, что Вы не читатель. 

Жаль, что Вы не понимаете простой вещи - с Вашим нынешним уровнем знаний Вы просто не в состоянии понять ответ на Ваш вопрос про Вашу несчастную строку. Вам ответили что с ней делать уже раз пять и даже код дали, но Вы не понимаете ответов - знаний не хватает. А единственный полезный совет - "пойти в билиотеку" и прокачать знания, воспринимаете так, как будто Вас в другое место посылают.

Рано или поздно, до Вас это дойдёт и Вы таки окажетесь в библиотеке. ну, а если не окажетесь. то так и будете всю жизнь, встретив каждую новую строку, скандалить на форумах и требовать "объяснений". После Н-ого такого захода. Вас уж реально начнут посылать не в библиотеку, а в другие места.

Вам жить, дело Ваше. А ответа про строку не требуйте. Вам уже ответили, просто Вы не поняли. И не поймёте без "библиотеки".

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

croan пишет:

блин, ребятыыыы...

не смог найти (по-крайней мере на понятном мне русском языке),

Если ты не знаешь английского, то нет смысла пытаться заниматься программированием, электроникой и другой наукой.

Россия тут не совсем при делах, и язык этих областей знаний - не русский.

Иди в "Ищу исполнителя" и плати деньги тем, кто знает английский.... Гы!

.................

2All: кстати, а что там у придурка за вопрос был?

bwn
Offline
Зарегистрирован: 25.08.2014

wdrakula пишет:

Если ты не знаешь английского, то нет смысла пытаться заниматься программированием, электроникой и другой наукой.

Россия тут не совсем при делах, и язык этих областей знаний - не русский.

Иди в "Ищу исполнителя" и плати деньги тем, кто знает английский.... Гы!

Злой ты, у меня так дебилизм языковый и ничего, с хоругвью, гуглом переводчиком и портретом Николая II (Кровавого) пробьемся к истине. А отмазка "не могу найти" обычно переводится как "не хочу искать". Практически все есть в русскоязычном поле. Тот же пргогмем только на этом форуме обсасывают чуть реже, чем мученическую  гибель миллиса на пятидесятый день.