Serial flush

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Serial flush

Příspěvek od PetrB » 11 črc 2018, 10:13

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

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

Re: Serial flush

Příspěvek od gilhad » 12 črc 2018, 06:37

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)

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Serial flush

Příspěvek od PetrB » 12 črc 2018, 09:03

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.

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Serial flush

Příspěvek od PetrB » 12 črc 2018, 09:15

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

Odpovědět

Kdo je online

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