Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
A szűz csippnél keressél rá az "larduino isp"-re. Ezzel tudod feltölteni a bootloadert, vagy a programot. A "larduino isp" működik LGT csippel is és atmegával is. Az LGT8F328D (nem P, hanem D) csippeket szinte csak ezzel lehet programozni. Bootloaderrel nem nagyon, mert azoknak annyira rossz a belső órajele.
Szerk: A Larduino ISP kapcsolásánál van egy felhúzó ellenállás. Sok helyen nem jelölik. Ez nélkül életképtelen. A hozzászólás módosítva: Szept 14, 2020
Idézet: „Olvasom a 283 oldalt, próbálom is, néha elakadok” Ha jól értem, akkor az ADC-t olvasod. Az ADC-je rendesen 12 bites. A módosulás az arduinóra alkalmazott libekben van. A lib-ben úgy írták le a mérést, hogy 2 mérés átlagát fogod kapni. Ez kissé időigényes. Ha gyorsan akarsz mérni és ezzel az MCU-val lehet is, akkor nem árt külön függvényt írni rá, hogy ne kétszer mérjen egy analogRead() parancsra. Egy méréssel is jól mér és a belső referencia feszültsége is megbízható.
Szia! Ez a problémám volt nekem is, de nem tudtam megoldani, csak megkerülni...
Egy mintával megmutatnád?
Szia!
Nem tudom, hogy tényleg ugyanaz-e a problémád, elmondom nálam mi volt. Nekem számjegyek érkeztek egy uint8_t tömbbe aminek a mutatója állt rendelkezésemre. Ezek 1 byte decimális értékének számjegyei voltak, tehát max 255. A végén egy stringzáró karakter is volt, szerencsére. Ha e tömb elemeit egyesével nézzük az nem túl célravezető, mert a számjegyek ASCII kódjait kapjuk. Ez egy WiFi-kommunikáció során kapott érték volt egyébként.(uint8_t *payload). Ebből a kívánt 1 byte-os érték:
Megy végre az ADC, de zajosabb, mint egy M328, de hát 12 bites 10 helyett, belefér. Érdekes egy állat ez a uC, tartogat meglepetéseket, ma megpróbálom túlhajtani
![]()
Rendes tápról, nem a számítógép USB-ről táplálva, feszültség referenciát használva a méréshez stabil tud lenni. 1 millivoltos felbontású méréshez azért már kell rendes körítés is.
Üdv!
Következő dolgot szeretném megvalósítani, ha lehet. ESP32 - Arduino IDE környezet. Lesz rengeg változóm, amit előre deklarálok. Wifin jönnek adatcsomagok (ESP32). Kulcs-érték páros, lehet, hogy JSON formátumban, lehet, hogy nem majd eldöntöm (android app fogja küldeni). Az adatcsomag char[] formában áll rendelkezésemre, ebből akartam kivenni a kulcs nevét az értéket pedig átadni ennek a nevű már ledeklarált változónak, és ezt nem így:
az összes értékre (mert rengeteg van) és nem egyfajta csomag jön, más-más adatok. hanem az adatfoyalmból szeretném kivennni a változó nevét és azt felhasználni. Tehát, ha az érkezett kulcs = "my_var" és az értéke = 25 akkor -> kulcsnev(ami jelenleg my_var, de bármi lehet) = ertek (ami most 25); Természetesen a my_var az előre deklarált változók egyike. Az érték átadása bárminek nem nehéz mert érték, de az értékből változó nevet kreálni az a fő feladat. A hozzászólás módosítva: Szept 16, 2020
Szia!
Ismerem a lib.et, de a linkelt oldal is direkt értékadást használ. Amit én szereetnék az legfeljebb valami pointeres trükkel lehetne megvalósítható, de mivel mint írtam különböző adatcsomagok jönnek, így azzal sem vagyok biztos. Így legfeljebb azt tudom csinálni, hogy a deserializációban mindent változót megadok, csak azt még nem tudom a lib mit ad értéknek ha az adott kulcs nincs a csomagban. Ha hiány esetén semmit akkor nincs gond, de ha kinullázza azt a változót akkor az összes(rengeteg) kulcsra még egy feltételvizsgálatot is kell végeznem. És mivel a csomagokat websockettel szeretném küldözgetni, a sok feltételvizsgálat nem tudom mennyire lassítaná be a dolgot. Mindenesetre most ezt igyekszem tesztelni.
Szia! Kb ez volt a problémám, hétvégén megpróbálom a mutatott megoldásoddal.
ESP32 esetén szerintem érdemesebb Stringet használni ha van elég idő, a vas bírja. És akkor már sokkal könnyebb a dolog, nem kell pointerkedni. Később kipróbálom konkrétan is
![]()
Én is arra tudok gondolni. Mindegy egyenlőre potival kiváltom, és ha megjön amit linekltél, akkor próba.
Amit szeretnél azt modernebb nyelvekben (java, C#) reflection-nek hívják, ahol például egy osztály változóját csak az osztály referencia és a mező neve alapján is lehet olvasni/írni.
Natív C++-ban ilyen nincs, de vannak megkerülő megoldások, pl: Link De a reflection drága, nem lesz gyorsabb mint az if else if.
Igen ezt keresem
![]() Köszönöm, átnézem mit tudok vele kezdeni, és milyen sebességet produkálhat.
Adatcsomagok feldolgozására if else vagy switch case. Ahogy fentebb a kolléga írta, más nyelveken van reflection. Javaban már én is implementáltam vele kommunikációs protokollt.
Legalább a változók kötött sorrendben érkeznek? Van olyan hogy valami nem jön? Jó lenne picit többet tudni az adatcsomagod jellemzőiről, hátha meglátunk benne valami hasznosat.
Véleményem szerint a más nyelvek hasonló megoldásai is eléggé drágák, hiszen attól hogy nyelvi szinten támogatja, még végre kell hajtani a lépéseit.. A hozzászólás módosítva: Szept 17, 2020
Köszönöm a linket. Sikerült elindítanom a timereket.
C-ben C++-ban futásidőben már nincsen meg a mezők neve információ, ezért nem lehet ilyet könnyen csinálni. Kicsit hasonló a serialization problémához: főleg kódgenerátorokkal lehet megoldani viszonylag szépen. A kódgenerátor valamilyen bemenet (pl egy táblázat) alapján forráskódot ad ki magából, amit aztán ugyanúgy kezelünk, mintha kézzel írt lenne, azaz betesszük a projektbe és fordítjuk, stb.
Például egy táblázat alapján egy template akár az általad írt C kódot is előállíthatja, amit aztán fordítasz, stb. Eggyel hatékonyabb megoldás lehet, ha a táblázat alapján sorszám indexet adsz a mezőknek, és ezen sorszámok alaján konstansokat definiálsz C-ben (pl define-nal), és ezek alapján már lehet switch case-t használni (ami tipikusan ugrótáblára fog fordulni, ha az indexek 0-tól kezdve "tömören" kihagyás nélkül jönnek, így egészen hatékonyan fog működni). Ennek hátránya, hogy ha a protokollt frissíted az egyik oldalon, akkor törékenyebb lehet a visszafelé kompatibilitás. Másik hátránya, hogy a másik oldalra (Android) is generálni kell a kulcsszavakat (bár ez a másik esetben is szebb megoldás, mert ha generálunk konstansokat, és azokat használjuk, akkor nem lesz elírásból hiba). Nyilván ilyen kódgenerátort csak akkor érdemes írni, ha valóban sok változóról van szó, különben felesleges erőfeszítés.
Helló!
Miért nem tömbökkel oldod meg? Pl kétdimenziós string() tömbbel? Ha jön az adat, azaz a kulcs, akkor megkeresheted, hogy melyik tömbindexhez tartozik az adott kulcs. Na már ha van, akkor egy újabb változó, ami annak megfelelően veszi fel az értéket, és ezzel a segéddel hívod meg a függvényt. Pl adatok[10][2] adatok[1][1]="Az egyik változód neve" adatok[2][2]=0 A kezdőértéke adatok[2][1]="A másik változód neve" adatok[2][2]=0 A kezdőértéke . . . Keresést meg kell oldani: Ha úgy szeretnéd ahogy most van (Túl van bonyolítva szerintem..) i=1; do while tömbméret or adatok[i][1]="VEGE" if adatok[i][1]==Myvar1 'Amit kaptál máshonnan Myvar1=atoi(adatok[i][2]) 'Hogy szövegből egész legyen, de ezt a változód típusa adja meg } if adatok[i][1]==Myvar2 'Amit kaptál máshonnan Myvar2=atoi(adatok[i][2]) 'Hogy szövegből egész legyen, de ezt a változód típusa adja meg } i++ De Lux verzió: Ha a küldő oldalon beteszel egy kis else-ágat, akkor azt is meg lehetne oldani, hogy a tömb még a használata előtt helyesen, minden értékel feltöltődjön. Vagy eleve 2X akkora tömböt használsz, mint amennyi lehetséges, az utolsó használt eleme meg pl legyen VEGE, és akkor addig mehet a keresés. A hozzászólás módosítva: Szept 18, 2020
Én is így fogtam volna neki a dolognak, de a kérdező már az elején leszögezte, hogy nem így :
Ezért kérdeztem hogy az adatfolyamról lehet-e valamit még tudni, folytonos-e, kötött-e a sorrendje, stb. De erre már nem kaptunk választ.
Erre létezik C++ konténer, a neve map.
C++ map Így nem kell implementálni a keresést, beillesztést, stb. Ráadásul így a kulcs lehet string, az érték pedig szám. A hozzászólás módosítva: Szept 18, 2020
OK!
Tényleg. Nem olvastam el "értőn" a kérdést. Bocs! ![]()
Ez jó nagyon!
Ha a kérdező nem is, de én használni fogom! ![]()
Már megérte!
![]()
Üdv!
Elnézést a kései válaszért, most jutottam gép elé. sargarigo: Az adatfolyamot én küldöm websocketen. Olyanná alakítom amilyenre akarom(amilyenre tudom bizonyos határok között). Többfajta adatfolyam fog érkezni, különböző időkben. Pl: ha megnyomom az 1-es gombot az APP-on akkor elküld valamit. Ha megnyomom a 2-es gombot akkor egészen más adatok érkeznek, 3-asra megint más. Folyamatban van a fejlesztés, mind az appon mind az ESP-n ezért még nem tudom pontosan mikor mit fogok küldeni, de ha összerakom akkor ismert lesz, hogy mi érkezik, tehát tudok rá feltételt szabni. Ezt akartam leegyszerűsíteni a reflection-al, hogy tök mindegy mi érkezik, kiveszem a változónevet is meg az értékét is az adatból, de ezt már elvetettem. Valami tömbszerű dolgon is gondolkodtam, de ez a Vargham által ajánlott map jónak tűnik. Mindenkinek nagyon köszönöm az ötleteket. A hozzászólás módosítva: Szept 18, 2020
Akkor én a helyedben egyszerűen megindexelném az adó oldalon, és nem kell változónevet küldeni (tehát gyorsabb lesz). Tehát megy az index, utána az érték.
A fogadó oldalon meg venném az indexet, és a következő adatot már tenném is a tömb indexedik helyére. Az indexeket pedig hogy ne kelljen fejben tartani melyik melyik, egyszerűen #define sorokkal adnám meg. Végeredmény, hogy egyetlen bájton átment a változóneved, egységesen tudsz kezelni mindent, és nincs benne if. Natívan szinte nulla a költsége ![]()
Akartam még folytatni, csak közben megzavartak, ezért gyorsan befejeztem a hozzászólást.
Egy adatfolyamban nem egy adat jön hanem több. Pl, most csináltam egy 6000byte (LED-ek adatai) plusz a websocket meg JSON 12kB. ![]() Támogatom az ötletedet a csomagazonosítóval kapcsolatban, ez van most napirenden. Így álltam hozzá most. Megnézem mire tudom használni a Vargham által ajánllott map aztán valami majd csak kisül belőle. A slusz poén, hogy ezeket az adatokat visszafelé is tudni kell küldenem úgy, hogy az app is tudja mi hová kerüljön. Ez a terv.
Ha jól értem, akkor van néhány mondjuk háromféle üzemmódod amik adatokat akarnak küldeni, de üzemmódon belül már ugyanúgy nem? Mert akkor elég ha az üzemmódot indexeled, aztán jöhetnek az adatok nyersen az üzemmódnak megfelelő tömbbe. Ebből már helyesen ki tudod venni ami és amennyi éppen kell. Nem lesz kavarodás. Mintha komplett rekordot küldenél el.
Így van. Jól érted. Nem egészen üzemmód, de fogjuk rá, és ezekhez kötöttek a csomagok. Vagyis egy adott csomag minig ugyanaztokat a változókat tartalmazza.
Én is így gondolom, csomagazonosító alapján már remélem nem lesz bonyolult a helyrerakás.
Hogyan lehet egyszerűen megoldani PC újra telepítésénél, hogy az Arduino IDE alá telepített könyvtárakat ne egyesével kelljen újra összevadászni.
|
Bejelentkezés
Hirdetés |