Posts: 700
Threads: 102
Joined: Jul 2016
Reputation:
222
04-28-2017, 07:41 PM
(This post was last modified: 04-28-2017, 08:56 PM by vsavic.)
Uzeo sam da se igram sa cordova i HM-10 i naisao na jedan mali problem.
Koristio sam ovaj plugin:
https://github.com/don/cordova-plugin-ble-central
I sad preko success callback metode ovog event-a ' startNotification' ja dobijem podatke nazad, medjutim posto sam HW salje u chunk-ovima, zanima me kako bi mogla da se odradi nesto slicno ovome u arduinu:
Code: while (Serial.available() > 0) { //... }
...ili da primenim staru dobru odokativnu metodu da sacekam otprilike kad je sve primljeno pre nego pustim sledeci write
Edit, za moj primer ovo nije problem, jer imam poznat terminator koji mogu da ocekujem u code-u za kraj poruke, medjutim zanima me i dalje za slucaj kad ne znam sta ce da stigne.
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
04-28-2017, 10:44 PM
(This post was last modified: 04-28-2017, 11:09 PM by mikikg.)
Seriska veza je vrsta asinhrone komunikacije, to znaci da u sustini ti ne znas ni kad je pocetak ni kraj prenosa osim ako ti ne osmislis interno neki svoj protokol.
(ne diskutujem o samom fizickom prenosu jednog bita, to sve radi interno HW UART modul, pricam o nizu karaktera).
Cekanje nekog karaktera (\r ili \n) je u sustini OK sve dok baratas ASCII karakterima, cim krenes da baratas binarnim (0x00 - 0xFF) podacima onda krecu problemi jer taj stop karakter moze da se pojavi kao deo podatka ...
Takodje se tu pojavljuju problemi koji su vezani sa sam tvoj program a najvise je oko \0 (null karakter) sto njega ne mozes da preneses u ASCI formatu jer \0 oznacava kraj stringa i sve posle toga se ignorise ukoliko operises stringovima (nizom karaktera).
Timeout delay je jedno od resenja da se "sinhronizujes", dakle ako ti za npr 100ms ne stigne sledeci podatak (sledeci bajt) onda progrlasavas timeout i postavljas kraj komunikacije tj cekas nov pocetak ...
Drugo resenje je da imas specificirane duzine podataka koje ocekujes, recimo uvek cekas 8 bajtova i u saradnji sa timeout onda arbitriras pocetkom i krajem prenosa.
Ovo su generalne stvari oko seriske veze, nevezano koji program to obraduje u pozadini, Cordova/JS, C++ i ostalo ne pravi nikakvu razliku, sve mora da radi po istom principu seriske komunikacije.
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
04-28-2017, 11:16 PM
(This post was last modified: 04-28-2017, 11:21 PM by mikikg.)
Uzgred, posto seriska veza u sustini nema nikakvu kontrolu greske (niti ima mehanizam za re-transfer podatka kao sto to ima TCP protokol) tj ne mozes nikako da budes siguran da to sto si primio je tacno sto treba, onda se uvodi CRC za kontrolu greske gde prilikom svakog transfera podatka ti dodas i CRC checksum pa onda program koji prima te podatke moze da proveri CRC i ako se slaze da prihvati podatak dok u suprotnom ga ignorise.
Posts: 1.157
Threads: 27
Joined: Oct 2014
Reputation:
313
(04-28-2017, 07:41 PM)vsavic Wrote: ...ili da primenim staru dobru odokativnu metodu da sacekam otprilike kad je sve primljeno pre nego pustim sledeci write
Edit, za moj primer ovo nije problem, jer imam poznat terminator koji mogu da ocekujem u code-u za kraj poruke, medjutim zanima me i dalje za slucaj kad ne znam sta ce da stigne.
Ako postoji mogućnost, pre nego pustiš sledeći write, proveri u kom je statusu modul koji kontrolišeš. Može da se desi da tvoj prvi write nije srećno odigrao a ti nemaš info o tome jer nisi primio (adekvatan) odgovor.
Ovo:
while (Serial.available() > 0) { //... }
nije dobro, ukoliko nema tajmauta, jer može ovako da tera do besvesti.
Nisam još video neki modul koji nema specificirano šta može da ti stigne od njega kao odgovor. Ako si dobio nešto čega nema u specifikacijama to odbaci pa teraj dalje. Takođe, dato je i okvirno vreme za koje odgovor treba da stigne. Sve što je preko ignorišeš, opet preko tajmauta.
Najlepše je kad su obe strane tvoje. Onda komunikacija može da izgleda ovako:
START - DUŽINA PORUKE - PORUKA - KONTROLNA SUMA - KRAJ
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
04-28-2017, 11:46 PM
(This post was last modified: 04-29-2017, 12:07 AM by mikikg.)
Ovo sto Goran predlaze i isto sto sam ja pisao je tehnicki deo ModBus specifikacije, bas tako radi, ima timout, ima pocetak/kraj i ima CRC.
Pogledaj malo to, to je odlicno i vrlo robusno resenje za komunikaciju i nebi bilo lose da tvoja periferija bilo da je Master ili Slave pude uradjena po ModBus protokolu!
Ima tu i ModBus RTU i preko TCP-a sa adresiranjem, vrlo ozbiljna prica, to je industriski protokol vec jedno 40+ godina i jos uvek se koristi!
Posts: 700
Threads: 102
Joined: Jul 2016
Reputation:
222
04-29-2017, 02:44 AM
(This post was last modified: 04-29-2017, 02:45 AM by vsavic.)
Hvala na objasnjenju drugari, u ovom mom slucaju je ispalo poprilicno jednostavno na kraju, uzeo sam da detektujem kraj poruke preko unique karaktera (">") za koju je receno da se nikad nece naci u telu poruke vec da uvek ide na kraj. Tako da sam citanje resio tako, a slanje komandi umotao preko promise-a u angular-u i sve sljaka u kontrolisanom okruzenju
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
Crni "promisi" u JS, ko je to izmislio voleo bih da znam da popricam nesto sa njim
Da li znas da izmedju njegovog promisa i primljenog karaktera izmedju ima jedno 1M linija JavaScrip code-a minimummm?
Taj koji je to pravio stvarno nije normalan i to su se razvukli od kulina bana da bi jednu operaciju odradio koja je u ASM par linija code-a, ne znam sta da ti kazem, probao sam Angular i odradio jedan projekat sa tim ali to je kostalo surovo CPU resursa da bi to radilo kako treba ...
https://www.youtube.com/watch?v=1e1zzna-dNw
Posts: 700
Threads: 102
Joined: Jul 2016
Reputation:
222
04-29-2017, 03:26 PM
(This post was last modified: 04-29-2017, 06:50 PM by vsavic.)
(04-29-2017, 06:53 AM)mikikg Wrote: Crni "promisi" u JS, ko je to izmislio voleo bih da znam da popricam nesto sa njim
Da li znas da izmedju njegovog promisa i primljenog karaktera izmedju ima jedno 1M linija JavaScrip code-a minimummm?
Taj koji je to pravio stvarno nije normalan i to su se razvukli od kulina bana da bi jednu operaciju odradio koja je u ASM par linija code-a, ne znam sta da ti kazem, probao sam Angular i odradio jedan projekat sa tim ali to je kostalo surovo CPU resursa da bi to radilo kako treba ...
https://www.youtube.com/watch?v=1e1zzna-dNw Nisam nikad do sad imao potrebu da gledam u detalje sta im je ispod haube, ali na osvnovu broja korisnika, logicno mi je bilo da je kolko je vec moguce optiomalno, ali u svakom slucaju, taj deo moze relativno lako da se resi i bez promise-a nekom svojom prostom logikom.
Sto se tice videa koji si okacio, apsolutno se ne slazem oko dosta delova koje je naveo. Mislim, lik kuka kako ovo sto oni nude nista ne valja, a ne kaze nigde, da bi imao sve ovo sto oni nude, morao bi da potrosis X (poveci broj (pomnozen sa Y (opet poveca cena satnice) jer vec ulazis u deo koji nije bas za juniore)) programer sati, i da napravis nesto za svaku od celina koje ti trebaju, ili da kombinujes gomilu drugih resenja koje opet zahtevaju da ucis o svakoj od njih dodatno. E sad, dal ce neko da koristi NodeJS, Hadoop, Servicebus, i sl. ili ces da provedes vreme pisuci svoj protokol i izmisljajici toplu vodu ... sve to vec ide u stvar ukusa i stvar koliko vec neko hoce da plati (firma $ i vreme, ili ako neko radi za sebe, koliko ceni svoje vreme).
|