Lazarus - problen s while
Zdravím.
Nedavno jsem tu řešil programek na vyčitaní dat z vahy přes ser.port, který funguje, ale snažim se o další level.
Odešlu LazSerial1.WriteData(#$52#$0d#$0a);
A vrati se mi ST,GS,1450,kg
To první ST je že je vaha stabilní. Pokud není vrati NS, jako nestabilní. A tady je problem.
Normalně seděl na židli čipek, a když se na vaze zobrazilo ST, tak klik na tlačitko a data uložil a vytisknul.
Čipek už není.
https://i.postimg.cc/NG1h8qvN/v.png
https://postimg.cc/c6x4Wdwm
Po kliknutí na tlačitko by se v cyklu While mělo odesilat do váhy tak dlouho, dokud se mi nevratí stavvazeni = 'ST',
a pak vypsat bo Memo1.
Je to však opačně.
Nenapada někoho, de dělam chybu?
Děkují.
Když se ptáš na chybu v programu, bylo by více než z vhodné sem dát jeho kód.
Jsem s toho už tak dokokocený, že misto zdrojaku jsem tu dal 2X odrazek.
Tak se omlouvam.
https://pastebin.com/Hxj4krUu
Tak na první pohled tam vidím dva problémy:
1) Ten cyklus se prodávádí, dokud stavvazeni JE roven 'ST'. Ale ty ho chceš provádět dokud NENÍ, ne? Možná bych zvážil repeat..until místo while.
2) Ten cyklus je řízený proměnnou stavvazeni, která se v tom ale cyklu nemění. Takže jakmile se tam program jednou dostane, už tam i navždy zůstane.
Tak ten první bod jsem pořadně posral. Děkují opraveno.
while (stavvazeni = '<>') do
Ale stejnak to blbne.
https://i.postimg.cc/HnKSq1nh/x1.png
Tan druhy??
Ten stavvazeni je deklarovaný v public a mění se při čtení přes ser.port.
V cyklu odesilam žadost přes ser port a v procedure LazSerial1RxData se data vraci a tam se to mění.
Je to špatně?
Tohle nechápu, kam ti vypadlo to porovnávání s 'ST'?
S tím druhým máš asi pravdu, zase tak detailně jsem to nezkoumal.
No nevzpadlo.
Určitě bys stabilnější výsledky dostával, pokud bys to WriteData volal po konci čtení a ne v cyklu.
Nechapu. Mužeš trochu vic info?
Jako to volat v LazSerial1RxData?
Jsem zkusil tam dat timer a přes něj odesilat co vteřinu žadost a toto je ok.
Teď úplně nechápu proč Timer. Na začátku zavoláš LazSerial1.WriteData(#$52#$0d#$0a); v TForm1.Button1Click. A pak během příjmu v TForm1.LazSerial1RxData zkontroluješ, jestli je to v pořádku a případně tam znovu zavoláš LazSerial1.WriteData(#$52#$0d#$0a).
JJ, už to chapu.
Tak jak to mam s tým timerem, ale do IF přidat else a tam to znovu zavolat.
A v tom buttonu stejně necham while (stavvazeni = '<>') do
Jen nebudu znovu volat WriteData, ale čekat, až bude stavvazeni ST
Dik.
No jak chceš, takhle by ses vyhnul různým timerům a sleepům.
Jasně, timer pujde pryč.
Přes button odešlu WriteData a pak pod tým ve while budu čekat, až hodnota stavvazeni bude ST.
Dát jako On timer čtení váhy, je taky docela dobrý nápad. Po zmáčknutí tlačítka by se pak vzalo to, co už bylo načteno (osobně bych bral aspoň poslední 3 hodnoty, pokud jsou označené jako stabilní a neliší víc než málo, nebo bych čekal v cyklu while, dokud by tento stav nenastal (v tom while by se muselo volat application.processmessages), ještě mě napadá, že by button mohl nastavit nějaký příznak (čekání na platnou hodnotu) a podle toho by potom fungovala obsluha timeru, nebo by byl druhý timer, který by to zajišťoval). Osobně bych se bránil tomu zaseknout program čekáním na něco, co třeba ani nastat nemusí.
Lazarus zdědil po pascalu cyklus reperat, ten je podle mě na to vhodnější (kód se musí provst minimálně jsdnou)
Na že by céčko něco takového nemělo (do while), ale moc se to nepoužívá, ani nevim proč, jestli kvůli těm třem klikům navíc.
Osobně bych to viděl na:
To musí fungovat. Ještě by bylo dobré dát tam nějaký timeout, aby program neuváznul v té smyčce navěky. Pokud to načtení netrvá moc dlouho, tak bych to před dalším zpracováním načetl třeba třikrát a porovnal výsledky, aby se eliminovala možnost chyby přenosu. Protože jestli ten textovej řetězec neobsahuje žádnou konktrolu (jako třeba GPS, kde je xor kontrola), klidně chyba jednoho bitu udělá ze 1450 kilo třeba 3450 (samozřejmě v lepším případě udělá údaj nesmyslným, ale když jsem koukal na záznamy z GPS, hlavně na ty věty, které neprošly kontrolou, tak tam byly právě i takové, kde by se chyba jinak nepoznala, i když většina byla chybná na první pohled (třeba useknutá nebo s nesmyslnými znaky nebo nějak jinak poškozená)).
Tak to čtení mám tak jak poradil Wikan a bych řek, že je to dobrý napad.
Ale to "ještě by bylo dobré dát tam nějaký timeout, aby program neuváznul v té smyčce navěky" mi nedalo spat.
Takže asi klasika s repeat.
Nějake připominky?
Já bych se i v tomhle případě na cyklus vykašlal. Přidat bych si tam počítadlo, při každém neúspěšném pokusu ho zvednul a pokud by dosáhlo zvolené hodnoty, tak už bych to vážení neopakoval.
Ona to je vaha na nakladní auta do 65 tun.
Když někdo na ní vjede slušně, pomalu tak se ustali mnohem rychlejí než když na ní vjede nějake prase. a prasat je hodně.
Neopakuje se važení.
Při kliknuti se odešle jen jednou WriteData
V LazSerial1RxData se to opakuje dokud vaha je stabilní a pak ukonči
A přes repeat jen hlidam, až se ustali a načtu vahu.
Kluci, jsem se zadrhl na tom posledním.
Chci to uložit, ale aby v nazvu bylo datum a čas a soubor musí být bez připony.
Když použiju formatdatetime('ddddd h:nn', now), mám 17.01.2023 15:46
Počitač bere tečku mezí 01.2023 a tedy mám soubor 17.01 s připonou 2023 15:46
Potřebují změnít ty . třeba za -.
Projet postupně znak po znaku a nahradít bych zvlad.
Je jednodušší zpusob?
Dik.
Jsi si jistý tvou dvojtečkou? Tak v názvu souboru být nemůže.
Spíš bych doporučil něco jako:
Pak to bude správně seřazené.
2023-01-17 16:22 16-22
I tak se mu to melibi.
Když vezmu text soubor a dam přejmenovat, vyhodi chybu.
Takže asi i ta dvojtečka.
Vyhodí chybu. Aha. A nenapíše jakou chybu?
Lazarus žadnou nevyhodi a zamrzne.
Pokud toužiš po te systemové tak tady 2023-01-17 16:22 16-22
Označit - ctrl+c. Vytvořit nový dokumet. Kliknout na poličko uložit a pak ctrl+v, a uložit.
Už to mam vyřešene.
Děkují všem co pomohli.
Tak to je snad jasný, že název souboru s dvojtečkou není platný...
Tak jak kde, že ano ... u mě to například není žádný problém:
No jistě, vždycky se najde někdo, kdo musí dokázat opak. Z kontextu je asi všem jasné, že to provozuje na Windows...
Nevím, jestli jsem něco nepřehlídnul, ale jediné, co by na to ukazovalo, by bylo, že mu to bez vysvětlení spadne - jestli jsem přehlédnul nějaký kontext, tak mi ukaž kde ...
Nechce se mi plýtvat energií na nějaké přesvědčování a dokazování. Souhlasím s tím, že v některých operačních systémech může být dvojtečka v názvu souboru. Spokojen?
Tak takhle: