NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
dave_23
Tvůrce
Avatar
dave_23:31.10.2016 23:21

Zdravím. Zkoušim si hrát s arduinem a narazil sem na problém s událostí DigitalPinUpdated. Chtěl bych, aby se po každém stisknutí tlačítka na pinu 6, jen zvýšila hodnota proměnné a aktualizovala se i v textboxu na formuláři. Mám takový kód:

private void OnDeviceReady()
        {
            arduino.pinMode(6, PinMode.INPUT);
            arduino.DigitalPinUpdated += MyDigitalPinUpdated;
        }

        private async void MyDigitalPinUpdated(byte pin, PinState state)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                if (pin == 6)
                {
                    Test(state);
                }
            });
        }

        private void Test(PinState pinState)
        {
            if (pinState == PinState.HIGH)
            {
                cislo++;
                this.txtCislo.Text = cislo.ToString();
            }
        }

Problém je v tom, že metoda se volá jen někdy. Přesněji řečeno jen při třetím, devatenáctým, třicátýmpátým (a tak dál vždy po 16) stisknutí tlačítka. Ale při každém takovém zavolání se obslouží všechna nahromaděná stisknutí. (na výstupu textBoxu je tedy postupně: 0, 3, 19, 35, 51, 67, 83)
Nevíte někdo jak to zařídit, aby se metoda MyDigitalPinUpdated zavolala okamžitě po každém stisknutí tlačítka?

 
Odpovědět
31.10.2016 23:21
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na dave_23
ostrozan:1.11.2016 5:14

Moment - arduino + C#, TextBox?
Něco mi uniklo? Co to je za projekt?

 
Nahoru Odpovědět
1.11.2016 5:14
Avatar
jan.pichl
Člen
Avatar
jan.pichl:1.11.2016 18:14

Osobně taky neznám Arduino+C# jenom Wiring, ale zjevně je problém v tom asynchronním volání metody MyDigitalPinUp­dated. Zkus ji použít bez toho async.

Osobně si nedokážu dost dobře představit jak to ten AVR (pokud to tedy je na AVR) zpracovává když ten program v něm běží ve smyčce. Podle čeho se rozhoduje kdy si zavolá obslužnou metodu která přečte vstup a vypálí něco jako událost a kdy dá přednost jiným úkolům :)

ve Wiringu to je:

int buttonState = 0;         // variable for reading the pushbutton status

void setup()
{
    // initialize the pushbutton pin as an input:
    pinMode(6, INPUT);
}

void loop()
{
    // read the state of the pushbutton value:
    buttonState = digitalRead(6);

    // check if the pushbutton is pressed.
    // if it is, the buttonState is HIGH:
    if (buttonState == HIGH)
    {
// Fire Method after pressed button
        Test();
    }

//any

}
 
Nahoru Odpovědět
1.11.2016 18:14
Avatar
jan.pichl
Člen
Avatar
jan.pichl:1.11.2016 18:27

Vlastně jde o to že microcontrolér (Arduino Uno typicky s frekvencí 18MHz) periodicky testuje jestli je daný vstup v Log1 nebo Log0. A jak je to na to naroubovaný u tebe toť je otázka :)

 
Nahoru Odpovědět
1.11.2016 18:27
Avatar
dave_23
Tvůrce
Avatar
dave_23:1.11.2016 20:51

jedná se vlastně o sériovou komunikaci s arduinem na tomto principu.
Taky si myslím, že problém bude v tý "asynchronizaci". Ale chová se to prostě takto zvláštně. Osobně bych čekal, že pokud tlačítko zmáčknu jednou a počkám dostatečně dlouhou dobu, tak se obsluha té události zavolá. Ale ta se vždy zavolá až po tom třetím....atd zmáčknutí :-S

 
Nahoru Odpovědět
1.11.2016 20:51
Avatar
vodacek
Tvůrce
Avatar
Odpovídá na dave_23
vodacek:1.11.2016 21:06

a co zákmity?

 
Nahoru Odpovědět
1.11.2016 21:06
Avatar
jan.pichl
Člen
Avatar
Odpovídá na dave_23
jan.pichl:2.11.2016 5:19

https://github.com/…g/issues/103

Akceptované řešení
+20 Zkušeností
Řešení problému
 
Nahoru Odpovědět
2.11.2016 5:19
Avatar
jan.pichl
Člen
Avatar
Odpovídá na vodacek
jan.pichl:2.11.2016 11:00

To by jich odpálilo nejspíše více za sebou.

Dalo by se to ošetřit například kondenzátorem a nebo sledováním stavu vstupu po nějakou
dobu a uděláním průměru vzorku. Ale to se pořád bavíme o desce Arduina a ne o druhém konci seriové linky na kterou věší ty funkce.

Buď je problém v Arduinu ten že jeho program hromadí stisky do buferu a odesílá je po jeho zaplnění najednou, a nebo to samé dělá na druhém konci jeho program při vyčítání ze seriové linky.

 
Nahoru Odpovědět
2.11.2016 11:00
Avatar
jan.pichl
Člen
Avatar
Odpovídá na dave_23
jan.pichl:2.11.2016 11:02

Ještě mě napadlo zda máš shodně nastavenou seriovou linku pro přenos. Jak v Arduinu tak na PC ?

 
Nahoru Odpovědět
2.11.2016 11:02
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na dave_23
ostrozan:2.11.2016 15:05

Nainstaluj si (pokud nemáš) "ComSpy ":http://www.gollner.cz/index.php?… pověs to na příslušný com port a sleduj co se děje po stisku tlačítka - pokud arduino hned něco pošle, pak je problém v aplikaci s reakcí na přerušení od com portu.

 
Nahoru Odpovědět
2.11.2016 15:05
Avatar
dave_23
Tvůrce
Avatar
Odpovídá na vodacek
dave_23:2.11.2016 16:34

s těmi možná bude problém taky, ale to mě v tomto případě netrápí.
A tím spíš by na to měla aplikace reagovat ne? Když by jich přišlo víc. :-D

 
Nahoru Odpovědět
2.11.2016 16:34
Avatar
dave_23
Tvůrce
Avatar
Odpovídá na jan.pichl
dave_23:2.11.2016 16:38

Tohle vypadá na přesně stejnej problém. Díky. Doma si to pořádně pročtu a zkusím z toho něco vyzkoumat jestli to pomůže. :-)

 
Nahoru Odpovědět
2.11.2016 16:38
Avatar
dave_23
Tvůrce
Avatar
Odpovídá na ostrozan
dave_23:2.11.2016 16:42

Určitě zkusím. Ale dioda Tx vždy při stisknutí i puštění tlačítka blikne, takže předpokládám, že arduino něco posílá.

 
Nahoru Odpovědět
2.11.2016 16:42
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na dave_23
ostrozan:2.11.2016 18:45

Hm, takže to mají vymakané tak, že se hlídá i uvolnění tlačítka.
Nevím, neznám to a tady na fóru asi nikdo, ale evidentně to čeká buď nějaký znak, který přijde s tou 16. zprávou, nebo kdoví co, ale vypadá to tak, že na to používáš špatnou metodu , která je ale ta správná, to ví snad jen autor toho projektu.

 
Nahoru Odpovědět
2.11.2016 18:45
Avatar
dave_23
Tvůrce
Avatar
dave_23:10.11.2016 15:55

tak díky všem :-) byla nutná úprava v jednom z importovaných projektů. Popsáno je to na tomto odkazu.

 
Nahoru Odpovědět
10.11.2016 15:55
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.