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:
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?
@mamniciwszystko Sprawdź jak zmienia się "data", może przyjmuje wartość inną niż "Pressed", albo w ogóle żadnej nie przyjmuje, to już będzie jakiś trop.
@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ć.
@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:
@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
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.
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 ( ͡°ʖ̯͡°)
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?
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ć
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ę tekstNotPressed
. Więc jeślidata == Pressed
tobool isPressed = true
, a jeśli jest inaczej, to powinno byćbool isPressed = false
. I sprawdzam co chwilę w konsoli ale boolisPressed
jest ciąglefalse
(taką ma początkową wartość)HBOFF
czyli że przycisk nie jest wciśnięty. Napisfalse
to jest to właśnie zmienna, która mimo że ją zmieniam to i tak jest ciąglefalse
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);
}
));
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
Postawiłem breakpoint w miejscu
if (data.Equals("Pressed")) {
isPressed = true; <---- tu breakpoint
else [...]
Ale czemu tekst
Pressed
z SerialPortu !=Pressed
?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.
Komentarz usunięty przez autora
zmieniłem
if (data.Equals("Pressed")
na
if (data.Trim().Equals("Pressed")
i działa.
Dziwne, bo
data
przerzucałem bezpośrednio doTextBox
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!