Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

VB2010 - Kontrolka mscomm, jak uzywac?

ujus 30 Mar 2014 15:49 1845 16
  • #1
    ujus
    Level 13  
    Witam. Proszę o pomoc jak odczytać dane z portu szeregowego przy pomocy kontrolki jak w temacie. W przypadku VB2008 z zadeklarowanej zmiennej typu string np dane były przypisywane z EventArgs.dATA a tu to nie działa. Proszę o pomoc i przykład. Konfiguracja, otwarcie i zamkniecie portu pomijam bo to znam.

    Code:
    Public Class Form1
    

        Private Sub COM_OnReceive(ByVal sender As Object, ByVal e As Axmcscomm.ICommXEvents_OnReceiveEvent) Handles COM.OnReceive
            '....
            '....   
        End Sub
    End Class
    Ethernet jednoparowy (SPE) - rozwiązania w przemyśle. Szkolenie 29.09.2021r. g. 11.00 Zarejestruj się za darmo
  • #2
    ujus
    Level 13  
    Czy nikt mi nie może pomóc? A moze to jest przestarzałe i teraz inna jest inna metoda? Jeszcze raz proszę o pomoc.
  • Helpful post
    #3
    marcinj12
    Level 40  
    Myślę, że więcej osób korzysta z Serial Port: przykład.
  • #4
    ujus
    Level 13  
    Dzięki za odpowiedź. Przyglądałem się już temu ale nie bardzo wiem jak to ugryźć. Będziesz uprzejmy podać krotki przykład jak się do tego zabrać? Chodzi mi o odebranie znaków typu string i pokazanie np w textbox.
  • Helpful post
    #5
    cepelia
    Level 20  
    Ale co konkretnie cię interesuje albo z czym konkretnie masz problem...

    Zasada jest bardzo prosta, połączenie przez port com wymaga jego konfiguracji, i albo robisz to ręcznie na sztywno, albo tworzysz klasę w której go konfigurujesz, tak czy inaczej musisz podać pewne parametry początkowe portu.
    Potem czekasz na wystąpienie zdarzenia OnReceive (a dokładniej SerialDataReceivedEventArgs) po czym określasz kiedy chcesz aby nastąpił koniec transmisji i odebrane dane wciskasz do textboxa czy gdzie tam chcesz...

    Podpowiedź, możesz do konfiguracji portu użyć comboboxa wypełnionego w ten sposób (zobaczysz w nim dostępne porty komputera)

    Code: vbnet
    Log in, to see the code


    przykład wstępnej konfiguracji
    Code: vbnet
    Log in, to see the code


    otwarcie portu
    Code: vbnet
    Log in, to see the code


    odbieranie danych
    Code: vbnet
    Log in, to see the code


    w tym wypadku odbiera dane aż natrafi na "0"
  • #6
    ujus
    Level 13  
    Dziękuję cepelia. Super wszystko wyjaśniłeś. O konfiguracji portów itd nie mam problemów ale tez dziękuję. Dokładnie chodzi mi o odebranie znaków jeśli nastąpi zdarzenie, tak jak np windowsowskim terminalu. Czy pomozesz mi w tym kodzie jesli nastapi zdarzenie tzn będą przychodzić jakiekolwiek dane chce je zbierac do zmiennej np "odebrane" typu string?

    Code: vb
    Log in, to see the code


    Mysle ze duzo nie wymagam, prosze tylko o podstawy
  • Helpful post
    #7
    cepelia
    Level 20  
    A jak wygląda transmisja z układu podłączonego do portu ??

    To jest jakiś sterownik?? miernik?? czy co.. bo jak zauważysz masz tam jeszcze dwie opcje... "aż do znaku końca linii" i "Wszystko co dostępne"..

    Pokaż co w terminalu dostajesz... co ile czasu...
  • #8
    ujus
    Level 13  
    Nic nie dostaję. Chce tylko wiedzieć jak odbierać dane jeśli nastapi przerwanie np dane typu string . Pisze jeszcze w bascom i tam jest funkcja ISCHARWAITING umożliwiająca kontrole bufora wejściowego gdzie dalej mogę sobie obrabiać itd..Wiec tu nie musze sie martwic czy jest jakiś znak w buforze i od tej strony dla mnie jest wszystko jasne
    Rozumiem, ze w tym przykladzie OnReceived podany wyzej do tego służy tzn sprawdza czy nie znajduje sie znak oczekujący tylko niewiem jak je zbierac.
  • #9
    cepelia
    Level 20  
    Dobra... ostatnio dłubałem przy tym i wykombinowałem sobie tak...
    Z urządzenia zewnętrznego dostaję ramkę 16-sto bajtową w której 10 pierwszych bajtów jest tagiem rfid a 6 pozostałych jest godziną...

    Jak wyślę rozkaz do urządzenia żeby nadało dane (umieszczone zresztą w pamięci eeprom) to zaczyna się transmisja...
    Jeśli chodzi o odbieranie to można zrobić tak jak ty napisałeś i dać hanndle na sub w którym masz kod odbierania danych lub w zdarzeniu load dodać handler coś w tym guście...

    Code: vbnet
    Log in, to see the code


    sam kod do odbierania wysłałem ci wcześniej...

    nie wiem jeśli byś chciał np wpisać do textbox'a odebrane dane to zamiast czytaj_tag(msg) możesz umieścić coś takiego...

    Code: vbnet
    Log in, to see the code


    lub jakąś podobną konstrukcję...
  • #10
    ujus
    Level 13  
    Witaj ponownie. Niestety nie radze sobie z tym, okazuje się ze jestem zielony. Otwieranie i zamykanie portu nie ma z tym problemu ale dalej stoję w kropce z odbieraniem znaków. Wysyłam około co 1 sekundę po kilka znaków liczby i słowa. Na terminalu nie ma problemu. To kod który zmąciłem ale dalej dobrze nie rozumiem

    Code: vbnet
    Log in, to see the code
  • #11
    MArSTER_1
    Level 19  
    Jeśli umiesz otwierać port i zamykać to już dobrze.
    Dodaj na formę kontrolkę combobox - nie wiem który będzie miała numer - zmienisz w kodzie jeśli już masz taką kontrolkę. Jeśli bedzie to pierwsza kontrolka, to jej numer będzie ComboBox1.
    W zdarzeniu Load formy (Private Sub Form1_Load......) umieść kod:
    Code: vb
    Log in, to see the code

    To da ci wyszczególnienie wszystkich portów w komputerze przy starcie formy.Klikając na strzałkę w ComboBox będziesz miał listę rozwijaną portów z której wybierzesz ten do którego masz podłączone urządzenie - po prostu klikając na numer portu na liście.

    Następnie w przycisku otwierającym port będziesz mógł zapisać:kod
    Code: vb
    Log in, to see the code


    To było ustawianie parametrów działania portu.
    Teraz trzeba odebrać dane
    W zdarzeniu od odebrania BAJTU piszesz:
    Code: vb
    Log in, to see the code


    Jak to działa? Przerwanie portu szeregowego działa po napłynięciu jednego bajtu. jak widzisz sprawdza ono czy w buforze jest już na przykład 512 bajtów 9nie piszesz ile masz odebrać) i jeśli tak, to zapisuje je do tablicy. Gdybyś chciał wyświetlic to co odebrałeś dla sprawdzenia czy komunikacja i odbieranie działa to możesz użyc MsgBox. Na przykład tak:
    Code: vb
    Log in, to see the code
  • #12
    ujus
    Level 13  
    Niestety dalej nie daję rady :| Tak jak pisałem potrafię wybrać otworzyć i zamknąć port no ale dalej mam problem z odbieraniem znaków. Przy zdarzeniu wg kolegi MArSTER_1 dalej okienko TextBox jest puste :( Na terminalu działa. Wysyłam co około sekundę na sztywno przykładową godzinę (13:40) temperaturę (24.5) i słowo (slowo). Kaidy string zaczynam znakiem początku chr(2) i końcem chr(3). Wiec na terminalu wygląda to tak :
    Code:
    13:40
    
    24.5
    slowo
    13:40
    24.5
    slowo


    Ale wg kodu poniżej nie działa. Pomocy :cry:
    Code: vb
    Log in, to see the code
  • Helpful post
    #14
    MArSTER_1
    Level 19  
    Załaczam kod, który działa. odbiera dane z portu szeregowego i wyswietla je w MsgBox(). Zwróć jedynie uwagę na zdarzenieSerialPort1_DataReceived. Zmień w nim ilośc bajtów po której mają zostać odczytane dane z BUFORA portu szeregowego. Początkowo bowiem dane trafiają do bufora (każdy bajt oddzielnie wywołuje przerwanie i trafia do bufora) a stamtąd VB odczytuje je . W przykładzie VB czeka na zgromadzenie 512 bajtów, kprzepisuje je do tablicy i wyświetla jeden wybrany - dla sprawdzenia poprawności transmisji. W Bascomie sugeruję na poczatek wysłac na przykład 10 razy liczbę 5 (oczywiście w procedurze w VB zmienić 512 na 10) Przy poprawnym odebraniu w MsgBox wyświetli się 5. Póxniej możemy usprawnić
    Code: vb
    Log in, to see the code
    procedurę.
  • #15
    ujus
    Level 13  
    Witam kolegów. Chce bardzo podziękować za zainteresowanie tematem.W przypadku kolegi cepelia układ działa tak jak chciałem a u kolegi MArSTER_1 w msg mam tylko zero, może coś źle przepisałem.Potrzebuje troszkę czasu aby przeanalizować jak to działa do dalszej obróbki albo wynalazków. Mam nadzieję ze sobie poradzę a w razie czego dalej będę mógł się uśmiechnąć. Pozdrawiam
  • #16
    ujus
    Level 13  
    Witam. Jednak wróciłem znowu o poradę :cry: Do kolegi cepelia postanowiłem modyfikować Twój kod tzn zamiast dane w DataGridView1 chciałem wyświetlić je sobie w text.box'sie. Wiec dodalem zmienna "dane" i w programie jedną linijke ale niestety wyrzuca mi bład ktorego nie bardzo rozumiem.

    Code: vbnet
    Log in, to see the code

    A to bład ktory wyswietla

    InvalidOperationException was unhandled

    Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was created on.

    Czego nie rozumie? :cry:
  • #17
    cepelia
    Level 20  
    Bezpośrednio w klasie...

    Code: vbnet
    Log in, to see the code


    W load...

    Code: vbnet
    Log in, to see the code


    W handlerze do odbierania danych...

    Code: vbnet
    Log in, to see the code
    resztę skomentuj...

    Kod metody...

    Code: vbnet
    Log in, to see the code



    Używaj googla...