Caute!
pracujeme na jednom velkom projekte na suzaz a zastavil ma jeden problem . Jedna sa o inteligentne osvetlenie , mame driver na lampy cez protokol DALi . HW to funguje , problem je z programom .. ohladom arduina a dali je toho na nete malo nasiel som jeden kod ktory po uprave funguje polovicne na arduine nano - dokazem nastavit lampe jas , ale vycitat ho z regulatora zatial neviem .. problem je v tom ze ako procesor mam ATmega644P a mightycore . na atmega328p v pohode nahra a ide program , ale na 644p vypise chybu
invalid conversion from 'const char*' to 'char*' [-fpermissive]
cmd2 = readBinaryString(input.substring(8, 16).c_str());
jedna sa o tuto kniznicu
https://create.arduino.cc/projecthub/Na ... ler-506e44
pripadne, neskusal to uz niekto ?
Diky
Arduino a DALI
Moderátori: psichac, Moderátori
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Arduino a DALI
Nevinne vyzerajúca otázka a koľko s tým bude patálií, pretože treba vidieť hlboko do vnútorností C jazyka
V prvom rade treba vedieť aký je rozdiel medzi
To prvé je ukazateľ na pole znakov teda C string (pole znakov s ukončovacím znakom 0).
To druhé je to isté ale prekladaču sa naznačí že z nejakého dobrého dôvodu sa to pole znakov nemôže meniť. Teda musí byť konštantné.
A teraz treba rozklúčovať toto:
input je String. Ten nemá s C stringom veľa spoločné. String je objekt. Ako taký má nejaké svoje vnútorné premenné a potom metódy pomocou ktorých s nimi niečo robí.
Prvá metóda substring vráti zase String ale taký ktorý obsahuje iba určitú časť pôvodného stringu. Tam teda problém nie je.
Druhá metóda c_str robí takú zvláštnu vec a to že sprístupní text v objekte String ako c string. Lenže:
No a teraz sa dostávame k finále. Funkcia readBinaryString čakáva char *
No a tu platí pravidlo že char * na const char* sa pretypuje bez kecov lebo je to bezpečné. Opačne to ale bezpečné nie je. Preto kompilátor držkuje.
Von z toho sa dá dvomi spôsobmi. Hádaj akými?
V prvom rade treba vedieť aký je rozdiel medzi
Kód: Vybrať všetko
char* a const char*
To druhé je to isté ale prekladaču sa naznačí že z nejakého dobrého dôvodu sa to pole znakov nemôže meniť. Teda musí byť konštantné.
A teraz treba rozklúčovať toto:
Kód: Vybrať všetko
cmd2 = readBinaryString(input.substring(8, 16).c_str());
Prvá metóda substring vráti zase String ale taký ktorý obsahuje iba určitú časť pôvodného stringu. Tam teda problém nie je.
Druhá metóda c_str robí takú zvláštnu vec a to že sprístupní text v objekte String ako c string. Lenže:
to robí ako je C az C++ zvykom tak trochu nejakým hackom aby to bolo jednoduché a rýchle a k pamäti šetrné. Podmienkou je že ten string sa nesmie meniť. teda táto funkcia vracia const char*Converts the contents of a string as a C-style, null-terminated string. Note that this gives direct access to the internal String buffer and should be used with care. In particular, you should never modify the string through the pointer returned. When you modify the String object, or when it is destroyed, any pointer previously returned by c_str() becomes invalid and should not be used any longer.
No a teraz sa dostávame k finále. Funkcia readBinaryString čakáva char *
Kód: Vybrať všetko
int Dali::readBinaryString(char *s){
..}
Von z toho sa dá dvomi spôsobmi. Hádaj akými?
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
- Andrej152
- Zaslúžilý člen
- Príspevky: 1022
- Dátum registrácie: 29 Júl 2013, 12:49
- Bydlisko: prešov
- Vek: 22
Re: Arduino a DALI
Okej , ako citam musim zacat studovat riadne C
ale dobre , teraz zacinam uvazovat ako je to mozene ze pri arduine nano ( resp . vsetky ktore maju 328p ) tak to ide bez pipnutia , ale ak to prepnem na inu dosku - atmega 644p tak to hadze .. nieje pricina tam , ze tomu boardu co pouzivam - mightycore , jednoducho nemoze mu chybat nieco ?
EDIT: vyriesene!
miesto mightycore som dal saguino a nepipa ze daco zle a ide to !
ale dobre , teraz zacinam uvazovat ako je to mozene ze pri arduine nano ( resp . vsetky ktore maju 328p ) tak to ide bez pipnutia , ale ak to prepnem na inu dosku - atmega 644p tak to hadze .. nieje pricina tam , ze tomu boardu co pouzivam - mightycore , jednoducho nemoze mu chybat nieco ?
EDIT: vyriesene!
miesto mightycore som dal saguino a nepipa ze daco zle a ide to !
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Arduino a DALI
Pravda, na tento tretí spôsob som zabudol. Miesto jedného nefungujúceho bazmeku použijeme iný ktorý náhodou funguje. Potom to vyzerá tak že na protokol čo posiela dva byte v manchestrovom kóde treba hľadať na nete hotové riešenie.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
- Tribec Zacks
- Pokročilý člen
- Príspevky: 709
- Dátum registrácie: 26 Jún 2010, 00:00
- Bydlisko: Levice / Cork IRL
- Vek: 41
- Kontaktovať používateľa:
Re: Arduino a DALI
@Andrej152, Ak to chces s elektrotechnikou potiahnut niekam dalej ako byt macher v miestnom pat-a-mat elektro klube, tak mas teraz v tvojom veku najlepsi mozny cas sa vyprdet na vsetky arduinko k.k.tinky.... zober datasheet, pochop ako funguje protokol, ako ma vypadat jeho timing diagram, a naprogramuj to sam pre hw ktory chces pouzit, bez nejakych trapnych knizniciek co niekde funguju, niekde nie, co ani boh nereverzne.... a to plati pre vsetky projekty o ktorych si tu kedy pisal, kde su zakladne veci ako lcd displeje, rozne senzory a podobne (pokial nejde o usb alebo ethernet etc) Nebuduj si navyk ako kazdy druhy arduinista - macher pisania pseudokodu co v zivote nevidel datasheet a nevie co to je register mcu... Blby niesi, tak to nezahod, radi ti pomozeme ked sa budes s niecim takym trapit. A ak nemas, tak setri na nejaky zakladny dso osciloskop, bude ti viac nez potrebny.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.
- Andrej152
- Zaslúžilý člen
- Príspevky: 1022
- Dátum registrácie: 29 Júl 2013, 12:49
- Bydlisko: prešov
- Vek: 22
Re: Arduino a DALI
ano mas pravdu .
ale predsa, venujem sa elektronike a z mensej casti aj foteniu a zvuceniu..
programovanie nikdy som nemal ako nejaku zalubu - a ked nieco trebalo na rychlo arduino to rychlo vyriesilo. kedze dali som potreboval spravit do par dni tak nemal som velmi chut to studovat rovno som to skusil cez arduino a fungovalo to
ale predsa, venujem sa elektronike a z mensej casti aj foteniu a zvuceniu..
programovanie nikdy som nemal ako nejaku zalubu - a ked nieco trebalo na rychlo arduino to rychlo vyriesilo. kedze dali som potreboval spravit do par dni tak nemal som velmi chut to studovat rovno som to skusil cez arduino a fungovalo to
0
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 4 Odpovedí
- 1023 Zobrazení
-
Posledný príspevok od používateľa lucky62
-
- 20 Odpovedí
- 1035 Zobrazení
-
Posledný príspevok od používateľa jankrizan
-
- 11 Odpovedí
- 1452 Zobrazení
-
Posledný príspevok od používateľa mirosne
-
- 10 Odpovedí
- 627 Zobrazení
-
Posledný príspevok od používateľa budvar10
-
- 3 Odpovedí
- 4138 Zobrazení
-
Posledný príspevok od používateľa jankrizan