ASP.NET i port szeregowy

0

Witam

Napisałem prostą stronę w asp.net, teraz chciałbym dostarczać do niej dane przez port szeregowy z innego urządzenia.
W jakim miejscu projektu umieścić mechanizm pobierania danych przez port szeregowy aby dane były dostępne w stronkach projektu (np textbox)?
Na jakie zdarzenie startować mechanizm pobierania danych, w aplikacjach stacjonarnych robiłem to na załadowanie formy a tu?

0
kornik280 napisał(a):

W jakim miejscu projektu umieścić mechanizm pobierania danych przez port szeregowy aby dane były dostępne w stronkach projektu (np textbox)?

Napisz sobie klasę do komunikacji z portem szeregowym i utwórz w niej publiczną metodę, której będziesz sobie używał gdzie chcesz.

Na jakie zdarzenie startować mechanizm pobierania danych, w aplikacjach stacjonarnych robiłem to na załadowanie formy a tu?

Może na załadowanie strony? ;P

0

Dobrze ale jak będzie kilku userów którzy będą korzystać ze strony to kilka razy będzie wywoływane zdarzenie "ładowanie strony", dobrze myślę?

0

Tak właśnie działa aplikacja webowa

0

No więc tu mam problem, przecież ma jeden port szeregowy więc start pobierania danych musi być jeden. Jak do tego podejść?

0

Zastosować któryś z mechanizmów wzajemnego wykluczania. Najprościej - użycie obiektu Application.

0
kornik280 napisał(a):

No więc tu mam problem, przecież ma jeden port szeregowy więc start pobierania danych musi być jeden. Jak do tego podejść?

Co nazywasz "startem pobierania danych"? To urządzenie nie działa w trybie żądanie-odpowiedź tylko wysyła ciągle jakieś dane?

0

Mam timer który co pewien czas wysyła żadanie i dostaje odpowiedź, nie wiem kiedy włączyć ten timer. Najchętniej chciałbym aby timer działał cały czas tylko w takim wypadku nie wiem na jakie zdarzenie go włączyć.

0

Nie wiem co Twoja aplikacja konkretnie robi i czy aplikacja webowa jest w tym wypadku dobrym rozwiązaniem. Natomiast jeżeli chcesz wykonać coś jednorazowo przy starcie aplikacji webowej to w Global.asax.cs masz od tego metodę Application_Start.

0

Moja aplikacja ma umożliwiać monitoring urządzenia przez internet.
Znalazłem w klasie Aplication zdarzenie "Init" które jest opisane:"Occurs when the server control is initialized, which is the first step in its lifecycle. (Inherited from Control.)"
Czy to było by dobre?

0

@kornik280, ale jaki timer? JavaScriptowy? Ten z AJAX Extensions w WebFormsach?

0

Na razie mam aplikacje desktop (Window forms) i tam mam zwykły timer, oraz stronkę w web form-dwa osobne projekty które chce scalić.Myślę że da się stworzyć jakąś kase z timerem w projekcie asp.net ?
To może innaczej chce zrobić aplikacje do monitoringu urządzenia przez internet. Dane dostępne są przez port szeregowy, w czym to zrobić i jakie techniki użyć proszę o poradę

0
  1. Jeśli chcesz użyć ASP.NET WebForms, to Timer masz w sumie w toolboxie, wystarczy oprogramować jego zdarzenie Tick, zaś komunikację z portem możesz zaszyć w oddzielnej klasie, z której Timer będzie korzystał.
  2. Jeśli chcesz użyć MVC, to wystaw sobie WebService obsługujący port, i pytaj go dynamicznie przy użyciu AJAXa ze skryptu JS osadzonego na Twojej stronie.
    W tym akurat przypadku rozwiązanie 1 jest łatwiejsze.
0

Dobrze tylko na jakie zdarzenie włączyć timer tak abyzostał włączony tylko raz przy starcie serwera? Może być to zdarzenie "init" z klasy application?

0

Timer będzie miał każdy użytkownik swój. Ty chcesz mieć jedną instancję klasy obsługującej port, a nie jeden Timer, więc zrób z niej jakiegoś singletona i inicjalizuj w Application_Start w Global.asax.

0

Jeszcze raz nie wiem czy dobrze rozumie. Tworze klase która zapewnia mi komunikacje z portem szeregowym, otrzymywane dane są publicznie niech ta klasa nazywa się driver, na stronkach web forms są timery które odswieżają textboxy pobierając dane z klasy driver. Teraz w klasie driver też musi być timer gdyż musze okresowo odpytywać moje urządzenie. Ciągle nie wiem jak w klasie driver wystartować timer odptujący, jak z klasy driver dostać się do eventu wywoływanego przy starcie serwera
Gdzie mogę odszukać global.asax bo nie mam tego w projekcie

0
kornik280 napisał(a):

Teraz w klasie driver też musi być timer gdyż musze okresowo odpytywać moje urządzenie.

Musisz? Nie wystarczy odpytywać na żądanie użytkownika? Jest sens komunikować się z urządzeniem, gdy nikt nie ma otwartej strony?

Ciągle nie wiem jak w klasie driver wystartować timer odptujący,

A googlałeś? Np. tak: http://www.codeguru.com/csharp/sample_chapter/article.php/c7763/Working-with-a-Timer-in-C-The-Basics.htm

jak z klasy driver dostać się do eventu wywoływanego przy starcie serwera

Wcale. To serwer ma pytać driver, a nie odwrotnie.

Gdzie mogę odszukać global.asax bo nie mam tego w projekcie

W głównym katalogu projektu. Jeśli nie masz tam global.asax to znaczy, że nie tworzysz aplikacji ASP.NET.

0

Tak gdyby był jeden user to stronka mogła by wymuszać odpytywanie, ale co będzie w przypadku kilku userów gdy każda stronka będzie chciała inicjalizować pobieranie danych w klasie driver?

0

No, ale w czym widzisz problem? W klasie driver masz ciągle otwarty port, a ponieważ robisz z niej singleton, to jest tylko jedna. Timery ze stron odwołują się do tej klasy i wywołują metodę, która odczytuje dane z portu na żądanie.
Można to też zrobić nieco lepiej - w klasie driver zrobić timer, który np. co sekundę pyta port i odbiera wynik, a jak strona odpyta driver, to dostaje ostatnią znaną wartość.

0

A czy dobrze by było gdybym w klasie driver miał metodę która startuje odpytywanie urządzenia i metodę tą wywołuje w zdarzeniu na ładowanie strony. W metodzie tej była by flaga ustawiana po pierwszym włączeniu odpytywania, blokująca możliwość ponownego włączania odpytywania przez nową stronę (nowego usera). Ponadto w klasie driver byłaby druga metoda dostarczająca dane stronką wywoływana przez timer na web forms?

0

No to jest właściwie to, o co mi chodziło w pierwszym zdaniu poprzedniego posta. :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.