Komunikace Arduino-Nextion

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od ondraN » 19 říj 2019, 19:36

Problém bych viděl v tom, že hned po tom, co se do displeje něco nacpe, čteš odpověď displeje. Ono chvíli trvá, než se data do displeje odvysílají, pak nějaká reakce displeje a nakonec zase čas, než to displej odvysílá. Zkus před sekci "kontrola příchozí zprávy" dát podstatný delay. Pokud to pomůže a delay by vadil, doporučuji kontrolovat přírůstek znaků v přijímacím bufferu a začít zpracovávat, až třeba po dobu 100ms nepřibude žádný další znak.

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od mato » 19 říj 2019, 20:19

Děkuji za reakci....,
ten delay před "kontrolou příchozí zprávy" až tak moc nepomáhá,či spíše ten stav není stejně 100%.
Nehledě na to, že ta prodleva se mi tam až tak moc nehodí!!
A jakým způsobem bych měl kontrolovat ten přírustek znaků?
A ještě se chci zeptat,zda je podstatný rozdíl v tom kolik znaků(jak dlouhý text) v té přijímací zprávě přijímám,resp. odesílám z displeje.
Je lepší odesílat tu zprávu nejlépe o jednom znaku??
Z toho displeje data odesílám příkazem print,to je také v pořádku??

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od ondraN » 20 říj 2019, 07:53

mato píše:
19 říj 2019, 20:19
Děkuji za reakci....,
ten delay před "kontrolou příchozí zprávy" až tak moc nepomáhá,či spíše ten stav není stejně 100%.
Nehledě na to, že ta prodleva se mi tam až tak moc nehodí!!
A jakým způsobem bych měl kontrolovat ten přírustek znaků?
A ještě se chci zeptat,zda je podstatný rozdíl v tom kolik znaků(jak dlouhý text) v té přijímací zprávě přijímám,resp. odesílám z displeje.
Je lepší odesílat tu zprávu nejlépe o jednom znaku??
Z toho displeje data odesílám příkazem print,to je také v pořádku??
Přijímací buffer SoftwareSerial má 64byte a jeho přetečení se dá testovat funkcí overflow(). Pokud displej neposílá víc jak 64 znaků najednou a je zaručeno jejich čtení, neměl by vzniknout problém.
Problém ještě může být v tom, že se něco přijalo během komunikace s displejem, zůstalo to v bufferu až do okamžiku čtení odpovědi a přečetlo se to jako součást odpovědi do stringu zprava. Pokud je to možné, poslal bych si obsah toho stringu do PC (nebo na ten displej), abych viděl co tam opravdu je. Pokud tam bude i něco jineho, tak změnit způsob vyhodnocování (přidat kontrolu délky stringu, zjistit jestli obsahuje podřetězec "svetlo" ...).

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od mato » 20 říj 2019, 15:40

Tak jsem odzkoušel příjem odeslané zprávy na dislej.
Pokud testuji pouze 4 tlačítka je vše OK na 100%
Na káždé stisknutí to udělá přesně co má......
Ovšem pokud do smyčky(mimo toho kde kontroluji tlačítka) vložím další příkazi,tak už se stane,že to někdy vynechá a příkaz
vůbec neodešle na displej(zůstane tam stále zapsaný ten předešlý).Jsem sice o kus dál než včera,ale pořád to není ono :roll:

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od ondraN » 20 říj 2019, 19:22

Trochu jsem projel dokumentaci od od toho displeje a došlo mi, že ta odpověď "svetlo1..." je vlastně asynchronní událost a ne nějaká reakce na to, co se tam před tím nasypalo. Z toho trochu zmateného popisu my to hned nedocvaklo. Jde o to, že čteš string odpověď v každém projetí smyčky. Když displej nic nepošle (nedošlo k dotyku), tak vypadne to čtení na timeout, který máš nastavený na 100ms. Představ si situaci, kdy čekáš na přečtení ze sériového portu a 1ms před koncem nastaveného timeoutu, odešle displej info o dotyku. Za 1ms se vyšle tak 1 znak, ten se vyhodnotí jako nevalidní odpověď a v dalším kole se dočte ten zbytek a ten je zase nevalidní, protože kus chybí. Zkus dát celou tu kontrolu do podmínky, že je v přijímacím bufferu alespoň jeden znak a mělo by to fungovat.

Kód: Vybrat vše

// kontrola příchozí zprávy
if(swSerial.available()){
  String zprava=swSerial.readString();
  if(zprava== "svetlo1vyp"){
    digitalWrite(LEDka, LOW);
     stav=false;
     //delay(100);
    }
   else if(zprava== "svetlo1zap"){
      digitalWrite(LEDka,HIGH);
       stav=true;
      // delay(100);
    }
  }

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od mato » 20 říj 2019, 21:00

Děkuji za trpělivost. Já jen původně doufal,že tam mám někde něco špatně napsané,proto jsem to na začátku
nějak moc nerozpytvával. Ale koukám,že se do toho stejně zamotávám víc než jsem tušil :o .
No právě,dokud jedu smyčku jen s tlačítkama tak dobrý,ale v momentě,kdy to má hlídat i čidla to začne vypadávat.
Můžeš mi prosímtě dát nějaký příklad jak bych tu kontrolu konkrétně měl provádět. Buffer vím,že akorát existuje,ale jak s ním pracovat
je v tuto chvíli nad mé schopnosti.....

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od ondraN » 21 říj 2019, 06:48

Stav přijímacího bufferu se jednoduše zjistí přes funkci available(), která vrací počet byte v přijímacím bufferu. Asynchronní události (může se objevit kdykoli) se řeší buď přes nějaký interrupt a nebo periodickým dotazováním v programu, jestli událost nastala. Tak to vlastně řešíš i ty. Dotazuješ se na stav tlačítek i displeje. Na událost v displeji se dotážeš přes podmínku if(wSerial.available()){}; která se vyhodnotí jako splněná, pokud se něco načte do bufferu sériového portu (available() vrátí nenulovou hodnotu). Pak můžeš přečíst co ti displej posílá, klidně tím příkazem co jsi použil

Kód: Vybrat vše

  String zprava=swSerial.readString();
a podle obsahu se rozhodneš pro vhodnou reakci. Není to nic složitého, ale musíš si na začátku dobře promyslet kdy a co budeš posílat do arduina a jak na to má arduino reagovat. Vždycky se bohatě vyplatí nejdřív počmárat pár papírů a pak teprve začít kódovat 8-)

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od mato » 21 říj 2019, 21:15

Děkuji za vysvětlení...,tohle už tedy tak nějak chápu.Znova jsem to testoval a je to tak jak jsi psal,že se mi v "přijímací zprávě" občas
objeví mimo požadovanou hodnotu i nějaký nesmysl. Ale to jak eliminovat příjem těch nesmyslů už netuším. Ano..., to,že jí po ReadStringu následně vyhodnotím jako špatnou sice udělám,ale to tlačítko na displeji jsem už prostě jednou zmáčknul(a zbytečně),a ta zpráva je už špatně přijatá.
Našel jsem jeden článek naštěstí je i v češtiněhttp://docs.uart.cz/docs/serial/. Tak se pokusím z toho něco vydumat.
Tedy se spíš zeptám...,mohu tady nalézt řešení???

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od gilhad » 22 říj 2019, 02:19

Ja bych asi nepouzival ReadString, ale udelal si vlastni buffer, cetl ho po znacich (a pomoci while), jakmile by byla zprava, tak reagoval, odmazal a pokracoval se ctenim. A mel loop() co nejrychlejsi, aby se Serial buffer nestihnul preplnit. (a rozhodne se vyhnul vsem delay()).

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od mato » 22 říj 2019, 06:23

Já bych ještě doplnil svou předešlou odpověď. Je vůbec možné docílit 100% bezchybného načtení příchozí zprávy???
Nebo je prostě potřeba s tímto počítat,že občas dorazí do bufferu nějaký nechtěný znak a prostě ho vyhodnocovat jako špatný
a tomu přizpůsobit zbytek kodu a hold někdy to tlačítko na displeji zmáčkout znova. Koneckonců i v autě musím někdy zmáčknout na displeji
něco vícekrát,nebo to je jiná situace?
I to jsem už zkoušel načítat znak po znaku a kontroloval postupné naplňování příchozí zprávy,ale
výsledek je víceméně stejný. A to těsně před načítáním do bufferu ho vymažu,takže nějaký pozůstatek z předešlé zprávy by tam být neměl.
Ještě tedy nechápu proč a kde se ty chybné znaky vlastně berou,vždyť mu dám jasný příkaz rozsviť/zhasni.Nebo to po té seriové lince běhá nepřetržitě kde co??? Já měl do této doby za to,že je použita, když jenom já chci!! Nebo nebylo by lepší třeba používat SerialEvent???
Ale alespoň už trošku chápu,jak ta komunikace funguje :o .Do této doby jsem to nikdy neřešil,tak se omlouvám za asi hloupé otázky!
Přeji hezký den..,já jdu na šichtu :shock:

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 27 hostů