[ Megoldva ] Javascript USB-kezelési probléma

Fórumok

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. :(

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.

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...

tegyel a funkciokba console.log(sc)-t, hogy lasd van-e kulonbseg.

neked aztan fura humorod van...

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.
 

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?

Szerkesztve: 2022. 09. 19., h – 19:04

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 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.

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.