Ahoj,
hraju si s testovacím projektem, kde ladím pomocí výstupu do sériové konzole. Jako prostředí používám Visual Studio 2017.
Stala se mi zajímavá věc. Aplikace najednou přestala fungovat. Přeložil jsem ji, poslal do Arduina a spustil. V monitoru se objevilo něco jako Otevírám port, posílám,... (hlášky z Visual studia) a nic.
Různě jsem s tím laboroval, až mne napadlo vyčistit sériovou linku pomocí Serial.flush. Což pomohlo, ovšem nerozumím tomu jak. Sériovou linku používám pouze jako výstup pro ladění a myslel jsem, že flush počká na vyčištění vstupního bufferu, ale s výstupem nemá nic společného.
Můžete mi to někdo vysvětlit? Teď už mám na začátku po otevření linky rovnou flush a funguje to bez problémů (tedy až na to, že mi to žere první písmenka z výstupů, ale to mi tolik nevadí).
Díky
Pb
Serial flush
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Re: Serial flush
flush na vystupu ceka az se vsechno z bufferu odesle. (ceka na vycisteni vystupniho bufferu)
flush na vstupu by tak treba mohl smazat buffer a zacit prijimat od dalsiho znaku (ale v na strankach Arduina popsany neni)
Uvedom si, ze pri vystupu vubec nevis, co je na druhe strane linky, a zda to vubec ma nejaky buffer, natoz jak velky.
Typicky vysilajici program neco pocita, az najednou stvori nekde nejake pole bytu (treba vystupni retezec, nebo pole namerenych hodnot, nebo treba jen jednu hodnotu - pole delky 1) a preda to k poslani prez Serial - ten je seriovy a podstatne pomalejsi nez procesor, takze si knihovna do nejakeho bufferu ulozi, co se ma poslat a zahaji kmitani s pinama, zatimco tvuj program vymysli dalsi hodnotu. (V HW je buffer pro jeden, prave odesilany znak a jeden pro prave prijimany znak) Bezne tam neco bezi na pozadi (preruseni), co kontroluje, zda lze odeslat dalsi znak a pokud ano, tak si ho vezme z knihovny a posle. Protoze je buffer knihovny omezeny, tak kdyz se snazis pridavat porad dalsi data, tak se jednou zaplni a pak muze knihovna bud blokovat (dokud se ji neuprazdni dost bufferu) a tim ti zpomalit program a rozhodit casovani (u Arduina to tak IMHO dela), nebo naopak vyhodit chybu, ze nezvladla cely zadany vstup, a zpracovala jen tolik a tolik, zbytek at zkusis jindy znova (tohle dela napriklad ten HW).
Flush udela to, ze ceka, dokud se buffer knihovny nevyprazdni, takze pak vis, ze muzes posilat data do prazdneho bufferu (a kdyz jich nebude moc, tak to nebude blokovat), nebo naopak cely vysilac vypnout, protoze uz odvysilal vsechno co mel.
Obecne je snahou aby tvuj program porad pocital a mezi tim po lince bezel jeden znak za druhym tak rychle, jak to jen linka umoznuje.
Ted se podivame na prijimac - tomu se zenou data po lince jak jen to jde, HW nacte cely byte a ted co s nim - bud ho program zpracuje, nez dojde dalsi byte, nebo o dalsi byte prijdeme - takze je tam vetsinou nejaka knihovna, ktera ma buffer taky, prijimane znaky do nej cpe a Serial.read je z nej zase vybira.
Tady by flush (pokud by byl implementovan, nevim zda je) proste vymazal buffer, a volal by se ve chvili, kdy jsme docetli z linky nejakou odpoved na svou otazku, dalsi otazku jsme jeste nepolozili a co leze po linkce nas nezajima (pripadne tam ani nema co lezt, protoze jsme jeste neposlali zadost o dalsi data)
flush na vstupu by tak treba mohl smazat buffer a zacit prijimat od dalsiho znaku (ale v na strankach Arduina popsany neni)
Uvedom si, ze pri vystupu vubec nevis, co je na druhe strane linky, a zda to vubec ma nejaky buffer, natoz jak velky.
Typicky vysilajici program neco pocita, az najednou stvori nekde nejake pole bytu (treba vystupni retezec, nebo pole namerenych hodnot, nebo treba jen jednu hodnotu - pole delky 1) a preda to k poslani prez Serial - ten je seriovy a podstatne pomalejsi nez procesor, takze si knihovna do nejakeho bufferu ulozi, co se ma poslat a zahaji kmitani s pinama, zatimco tvuj program vymysli dalsi hodnotu. (V HW je buffer pro jeden, prave odesilany znak a jeden pro prave prijimany znak) Bezne tam neco bezi na pozadi (preruseni), co kontroluje, zda lze odeslat dalsi znak a pokud ano, tak si ho vezme z knihovny a posle. Protoze je buffer knihovny omezeny, tak kdyz se snazis pridavat porad dalsi data, tak se jednou zaplni a pak muze knihovna bud blokovat (dokud se ji neuprazdni dost bufferu) a tim ti zpomalit program a rozhodit casovani (u Arduina to tak IMHO dela), nebo naopak vyhodit chybu, ze nezvladla cely zadany vstup, a zpracovala jen tolik a tolik, zbytek at zkusis jindy znova (tohle dela napriklad ten HW).
Flush udela to, ze ceka, dokud se buffer knihovny nevyprazdni, takze pak vis, ze muzes posilat data do prazdneho bufferu (a kdyz jich nebude moc, tak to nebude blokovat), nebo naopak cely vysilac vypnout, protoze uz odvysilal vsechno co mel.
Obecne je snahou aby tvuj program porad pocital a mezi tim po lince bezel jeden znak za druhym tak rychle, jak to jen linka umoznuje.
Ted se podivame na prijimac - tomu se zenou data po lince jak jen to jde, HW nacte cely byte a ted co s nim - bud ho program zpracuje, nez dojde dalsi byte, nebo o dalsi byte prijdeme - takze je tam vetsinou nejaka knihovna, ktera ma buffer taky, prijimane znaky do nej cpe a Serial.read je z nej zase vybira.
Tady by flush (pokud by byl implementovan, nevim zda je) proste vymazal buffer, a volal by se ve chvili, kdy jsme docetli z linky nejakou odpoved na svou otazku, dalsi otazku jsme jeste nepolozili a co leze po linkce nas nezajima (pripadne tam ani nema co lezt, protoze jsme jeste neposlali zadost o dalsi data)
Re: Serial flush
Díky za vysvětlení.
Mě na tom celém zarazilo hlavně to, že k problému došlo náhle (po opětovném kompilování a odeslání stejného kódu) a u programu (na jeho úplném začátku), který pouze posílá ladící informace do PC. Patrně bylo Visual Studio ukecanější a Arduino zahltilo požadavky.
Mě na tom celém zarazilo hlavně to, že k problému došlo náhle (po opětovném kompilování a odeslání stejného kódu) a u programu (na jeho úplném začátku), který pouze posílá ladící informace do PC. Patrně bylo Visual Studio ukecanější a Arduino zahltilo požadavky.
Re: Serial flush
Ještě mne napadlo, jestli na to nemá vliv, že Visual Studio používá ke komunikaci rychlost 115200 Bd a já ho nedokážu přinutit, aby ji trvale snížil. Mám desku Mega 2560 a předtím jsem používal klasické Arduino prostředí, kde bylo 9600 Bd a v pohodě to stačilo (ale i na těch 115200 to nějaký čas fungovalo bez problémů).
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů