Zapis adresu DS'a do EEPROM'u

User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

Witajcie,

Podpowiedzcie mi proszę jak najlepiej zapisać adres czujnika (z inputboxa) do pamięci i odczytać go do zmiennej w takiej postaci, abym mógł go użyć w programie:

Code: Select all

DeviceAddress ds0addr = moja_zmienna // {0x28, 0x9C, 0x16, 0x16, 0xA8, 0x01, 0x3C, 0x09};
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

lukfud wrote: Thu Oct 29, 2020 10:25 am Witajcie,

Podpowiedzcie mi proszę jak najlepiej zapisać adres czujnika (z inputboxa) do pamięci i odczytać go do zmiennej w takiej postaci, abym mógł go użyć w programie:

Code: Select all

DeviceAddress ds0addr = moja_zmienna // {0x28, 0x9C, 0x16, 0x16, 0xA8, 0x01, 0x3C, 0x09};
A nie działa zwykłe:

Code: Select all

DeviceAddress ds0addr = {....};
EEPROM.update(addr, ds0addr);
...
EEPROM.get(addr, ds0addr);
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

klew wrote: Thu Oct 29, 2020 10:33 am

Code: Select all

DeviceAddress ds0addr = {....};
EEPROM.update(addr, ds0addr);
...
EEPROM.get(addr, ds0addr);
Ale chciałbym najpierw zapisać adres z GUI do zmiennej.
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

lukfud wrote: Thu Oct 29, 2020 10:40 am Ale chciałbym najpierw zapisać adres z GUI do zmiennej.
Typ "DeviceAddress" to po prostu tablica 8 bajtów.
Więc musisz sobie skonwertować ze stringa z GUI do bajtów i przypisać.

Możesz spróbować parsować stringa metodą sscanf.
Ewentualnie odczytywać każdy "bajt" ze stringa i konwertować metodą "strtol".

Możesz też poszukać tutaj dodatkowych inspiracji ;)
https://stackoverflow.com/questions/172 ... byte-array
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

klew wrote: Thu Oct 29, 2020 10:56 am Ewentualnie odczytywać każdy "bajt" ze stringa i konwertować metodą "strtol".
Czy ten kawałek kodu znalazł by tu zastosowanie?

Code: Select all

String read_guid(void) {
  String read_eeprom = "";
  int i, ii = 0;
  int eep_star = 460;
  int end_guid = eep_star + SUPLA_GUID_SIZE;
  String temp_read = "0x";
  for (i = eep_star; i < end_guid + 16;  i = i + 1) {
    temp_read += char(EEPROM.read(i));
    read_eeprom += char(EEPROM.read(i));
    if ( (i % 2) == 0) {
      char *_guid = strcpy((char*)malloc(temp_read.length() + 1), temp_read.c_str());
      guid[ii] = strtoul( _guid, NULL, 16);
      temp_read = "0x";
      ii++;
    }
  }
  return read_eeprom;
}
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

lukfud wrote: Thu Oct 29, 2020 11:13 am Czy ten kawałek kodu znalazł by tu zastosowanie?
W zasadzie tak, tylko zamiast czytać z EEPROM bajt po bajcie, powinieneś czytać tego stringa z adresem.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

klew wrote: Thu Oct 29, 2020 11:16 am
lukfud wrote: Thu Oct 29, 2020 11:13 am Czy ten kawałek kodu znalazł by tu zastosowanie?
W zasadzie tak, tylko zamiast czytać z EEPROM bajt po bajcie, powinieneś czytać tego stringa z adresem.
Czyli najpierw wrzucić z eepromu do stringa a potem konwertować? Mógłbyś mi ten kod odpowiedni zmienić?
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Pokaż może najpierw w jakiej postaci masz ten string z adresem DSa
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

klew wrote: Thu Oct 29, 2020 11:53 am Pokaż może najpierw w jakiej postaci masz ten string z adresem DSa
W zasadzie może być on dowolny, jak go wpiszę w inputboxa, taki będzie. Chciałbym jednak ograniczyć ilość wykorzystanych komórek pamięci, wiec postać była by taka:

Code: Select all

286ECA79A213F5
dla

Code: Select all

0x28, 0x6E, 0xCA, 0x79, 0xA2, 0x1, 0x3, 0xF5
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

lukfud wrote: Thu Oct 29, 2020 12:02 pm W zasadzie może być on dowolny, jak go wpiszę w inputboxa, taki będzie. Chciałbym jednak ograniczyć ilość wykorzystanych komórek pamięci, wiec postać była by taka:

Code: Select all

286ECA79A213F5
dla

Code: Select all

0x28, 0x6E, 0xCA, 0x79, 0xA2, 0x1, 0x3, 0xF5
Nie ma sensu zapisywać do EEPROM ciągu znaków. Dla DSów wystarczy zapisać 8 bajtów.

W przypadku strina z przecinkami, albo innymi odstępami, najłatwiej będzie to zrobić metodą strtok (z <cstring> lub <string.h> - zależnie od kompilatora) (http://www.cplusplus.com/reference/cstring/strtok/)

Coś w ten deseń:

Code: Select all

  char inputString[] = "0x28, 0x6E, 0xCA, 0x79, 0xA2, 0x1, 0x3, 0xF5";
  DeviceAddress ds;
  int counter = 0;
  char *pch = strtok(inputString, " ,");
  while (pch != NULL) {
    ds[counter] = strtol(pch, NULL, 16);
    pch = strtok(NULL, " ,"); 
    counter++;
    if (counter >= 8) break;
  }
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Pomoc”