Wpis z mikrobloga

Używam SerialPortu w #csharp #visualstudio aby nasłuchiwać czy mam wciśnięty przycisk na swoim Arduino.
Problem w tym, że w moim Form1.cs mam bool isPressed = false, zmian na arduino nasł#!$%@?ę kodem (w skrócie) serialPort.DataReceived += SerialPort_DataReceived; i widzę, że dostaję czy np. jest wciśnięty czy nie, ale w funkcji mam coś takiego:

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);
string data = serialPort.ReadLine();

if (data == "Pressed")
{
isPressed = true;
} else
{
isPressed = false;
}
}

i ta wartość isPressed nigdy się nie zmienia.
Co jest nie tak? Czy to może dlatego że dzieję się to z innego wątku?
  • 17
@mamniciwszystko: Zmień sobie to może w ten sposób, by tylko zmiana stanu wywoływała event (wciśnięty->niewciśnięty, nie "sprawdź miliony razy na sekundę czy akurat teraz wciśnięty i zmieść odpowiedź w 8bajtach") - lastState == currentState najprościej, może interrupty jak trzeba. Sprawdź przede wszystkim kod na czyli czy na urządzeniu wciśnięcie buttona powoduje jakąkolwiek reakcję mikrokontrolera. IIRC w każdym modelu jest jakiś wbudowany LED, który możesz zaświecić.

Dwa, ten if można pewnie uprościć
@Goglez: @MostlyRenegade
Tak jak pisałem, sprawdzałem jak zmienia się "data" i jak wcisnę przycisk, to dostaję jednorazowo tekst Pressed a jak go puszczę to dostaję tekst NotPressed. Więc jeśli data == Pressed to bool isPressed = true, a jeśli jest inaczej, to powinno być bool isPressed = false. I sprawdzam co chwilę w konsoli ale bool isPressed jest ciągle false (taką ma początkową wartość)
@unxtres: tak jak na zrzucie - jak wcisnę czy przytrzymam to jednorazowo dostaję 'HBON' czyli że wciśnięty, jak puszczę to dostaję z arduino HBOFF czyli że przycisk nie jest wciśnięty. Napis false to jest to właśnie zmienna, która mimo że ją zmieniam to i tak jest ciągle false
@MostlyRenegade: wartość poprawnie zmienia się w zależności od tego czy mam wciśnięty przycisk czy nie.
Dodam, że tekst muszę aktualizować w ten sposób bo inaczej dostaję błąd że ruszam Formant z innego wątku:

debuggerTextBox.Invoke(new Action(delegate ()
{

debuggerTextBox.AppendText("\n" + message + isPressed);
}
));
@hoodoovoodoo: Właśnie tak mam zrobione, że Arduino wysyła mi tylko jeśli mam wciśnięty przycisk lub jeśli go puszczę to dostane odpowiedź z arduino, że przycisk już nie jest wciśnięty.
To wszystko dzieje się jednorazowo, klikam przycisk, dostaję raz, że przycisk jest kliknięty, puszczam, dostaję raz, że przycisk już nie jest wciśnięty. Pomyślałem o tym pisząc już sam kod dla płytki Arduino, że złym pomysłem może być spamowanie SerialPortu
@mamniciwszystko: a linijkę wyżej?

Edit: do czego zmierzam: sprawdź, czy rzeczywiście ten event jest za każdym razem przechwytywany i jakie są dane. Jak już pewnie wiesz, komunikacja przebiega w innym wątku niż UI, ale dokumentacja mówi coś o tym, że even nie zawsze jest odpalany.
@MostlyRenegade: Dobra, rozwiązane.
zmieniłem

if (data.Equals("Pressed")
na

if (data.Trim().Equals("Pressed")
i działa.
Dziwne, bo data przerzucałem bezpośrednio do TextBox i nie było tam żadnych pustych spacji.
I wierzcie mi lub nie ale ja nad tym siedziałem 3 godziny ( ͡° ʖ̯ ͡°)

Dzięki za pomoc!