Diskuze: DigitalPinUpdated

C# .NET .NET (C# a Visual Basic) DigitalPinUpdated American English version English version

Avatar
dave_23
Člen
Avatar
dave_23:

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. října 23:21
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na dave_23
ostrozan:

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

 
Nahoru Odpovědět 1. listopadu 5:14
Avatar
jan.pichl
Člen
Avatar
jan.pichl:

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. listopadu 18:14
Avatar
jan.pichl
Člen
Avatar
jan.pichl:

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. listopadu 18:27
Avatar
dave_23
Člen
Avatar
dave_23:

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. listopadu 20:51
Avatar
vodacek
Redaktor
Avatar
 
Nahoru Odpovědět  +1 1. listopadu 21:06
Avatar
jan.pichl
Člen
Avatar
 
Nahoru Odpovědět  +1 2. listopadu 5:19
Avatar
jan.pichl
Člen
Avatar
Odpovídá na vodacek
jan.pichl:

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. listopadu 11:00
Avatar
jan.pichl
Člen
Avatar
Odpovídá na dave_23
jan.pichl:

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

 
Nahoru Odpovědět 2. listopadu 11:02
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na dave_23
ostrozan:

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  +1 2. listopadu 15:05
Avatar
dave_23
Člen
Avatar
Odpovídá na vodacek
dave_23:

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. listopadu 16:34
Avatar
dave_23
Člen
Avatar
Odpovídá na jan.pichl
dave_23:

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. listopadu 16:38
Avatar
dave_23
Člen
Avatar
Odpovídá na ostrozan
dave_23:

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. listopadu 16:42
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na dave_23
ostrozan:

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. listopadu 18:45
Avatar
dave_23
Člen
Avatar
dave_23:

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. listopadu 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.