Egy böngésző alapú alkalmazásból javascripttel kommunikálok USB-n keresztül az xterm.js segítségével.
Mivel a soros kommunikációt csak felhasználói beavatkozásra engedi megnyitni a Chrome (Firefox még úgy sem), így jelenleg, ha a felhasználó megnyom egy gombot, akkor meg tudom nyitni az USB kapcsolatot, adatot tudok cserélni az eszközzel, és utána le tudom zárni a kapcsolatot. Minden megnyitáshoz a felhasználónak ki kell választania a soros portot. Ez működik, de nehézkes.
Szerettem volna egy megnyitás és egy lezárás gombot is készíteni, de itt kezdődött a probléma. Ha egy külön esemény nyitja meg a soros portot, akkor hiába küldök rá bármit, már nem működik.
Azaz a következő kód megy:
function on_click() {
var sc = new SerialComm();
sc.sendCmd( command );
sc.close();
}
A következő pedig nem:
var sc;
function on_click_open() {
sc = new SerialComm();
}
function on_click_send() {
sc.sendCmd( command );
sc.close();
}
Hibaüzenetet nem kapok, csak nem megy.
Van valakinek ötlete, mi lehet a probléma? Vagy ez valamilyen biztonsági megkötés, és így soha nem is fog menni, csak egy eseményben?
Megoldás: gond nélkül megy külön a megnyitás és a kommunikáció, nincs korlátozás. Én hibáztam a SerialComm osztályon belül. :(
- 305 megtekintés
Hozzászólások
USB-t nem kezeltem még javascript-ből, de gyanítom hogy biztonsági megfontolásból megy csak user klikkre. Hasonlóan mint a copy to clipboard funkció. Ha klikk eseményre történik, akkor működik, kólönben nem és nincs hibaüzenet sem.
A tudomány és a hit vitája akkor eldőlt, amikor villámhárítót szereltek a templomokra.
- A hozzászóláshoz be kell jelentkezni
en ugy ertettem, hogy azt irja, mindharom esemeny user klikk, csak elso esetben a megnyitas es a parancs kuldes ugyanabban a klikkben talalhato, mig a masodik esetben ket kulon klikkben.
ez lehet programhiba is, de lehet hogy valami szamunkra ismeretlen ok miatt direkt igy csinaltak meg.
neked aztan fura humorod van...
- A hozzászóláshoz be kell jelentkezni
Jól érted. Természetesen mindkettő esemény külön klikk. A megnyitás klikkje le is fut, és meg is nyitja a kapcsolatot, csak a küldés nem megy már ki, és hibaüzenet sincs, hogy miért.
- A hozzászóláshoz be kell jelentkezni
tegyel a funkciokba console.log(sc)-t, hogy lasd van-e kulonbseg.
neked aztan fura humorod van...
- A hozzászóláshoz be kell jelentkezni
Próbáltam már vizsgálni, hogy az sc változó más-e, de nem más. Egyébként ez az SerialComm egy saját osztályom ami a navigator.serial objektumot használja.
Az sc objektum mindkét esetben létrejön, a műveletei lefutnak, csak a szétbontott esetben már nem történik semmi az üzenetküldés során.
- A hozzászóláshoz be kell jelentkezni
Mit fejlesztesz? Biztos a bongeszo+JS erre a megfelelo kornyezet?
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
Ez egy webes CNC kezelő felület. Egyszerű G-Code parancsokat küld a CNC-nek. Leginkább azért javascript, mert ha rendben működik majd, akkor beépítésre kerül a kód egy már meglévő javascript alapú szerkesztőfelületbe.
- A hozzászóláshoz be kell jelentkezni
Amíg nem látjuk a saját SerialComm osztályodat, nem tudunk mit mondani. Mit csinál?
Ha minden egyes on_click_send() bezárja a soros portot, akkor ne csodálkozz, hogy csak egy alkalommal megy rajta a küldés.
Az első esetben minden egyes küldésnél három dolgot csinálsz: megnyitod a portot, küldesz valamit, bezárod. Ezt akárhányszor hívhatod, hiszen a portot mindig 0-ról nyitod/zárod.
A második esetben a küldés után bezárod a portot azonal - nyilván a második meghíváskor már zárva lesz.
Nem is értem, hogyan gondoltad, hogy ez működni fog. Nem értem, az on_click_send miért zárja be a megnyitott portot, nem dolga ez.
- A hozzászóláshoz be kell jelentkezni
A fenti kommented alapján akkor te a Web Serial API-t használod (ami ugyebár nem összekeverendő a WebUSB API-val), csak a pontosítás végett.
Az egészen biztos, hogy működik a gyakorlatban is, hogy egyszer hozzákapcsolódsz az eszközhöz a megadott soros porton keresztül, majd tetszőleges időpontokban többször írsz/olvasol rá/róla. Szerencsére még olyan biztonsági megkötés sincs, hogy csak felhasználói interakció válthat ki soros üzenetküldést. (A kapcsolódás más téma, az picit nehézkesebb, de ha esetleg fix a felhasználói kör, akkor csoportházirenddel lehet szórakozni.) Tehát elvi szinten működnie kellene a külön csatlakozás és üzenetküldés funkcióknak, de ennyi infóból valóban nehéz pontosabbat mondani.
- A hozzászóláshoz be kell jelentkezni
Köszönöm az iránymutató észrevételeket. Ezek alapján vizsgálva a kódomat megtaláltam a hibát: mivel a kommunikációs parancsokat egy pufferbe gyűjtöttem, a puffer ürítésénél hibáztam. Az ürítést csak akkor kezdtem meg, ha a megnyitás sikeres volt, és puffer nem volt üres.
Ez az első változatban azonnal teljesült is, mivel a megnyitás viszonylag lassú folyamat alatt már bekerültek a parancsok a pufferbe.
A második esetben azonban a külön megnyitási esemény miatt a puffer még üres volt a megnyitás végére, és később meg már nem indítottam el annak kiürítését.
Ezt javítva rendben működik. Még egyszer köszönöm a segítségeteket.
- A hozzászóláshoz be kell jelentkezni