logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak odczytać dane z czujnika RS232 w VB? Konfiguracja i kod programu

mr_egon 20 Mar 2007 00:27 1380 4
REKLAMA
  • #1 3697612
    mr_egon
    Poziom 11  
    Posty: 15
    Witam, przedstawiam problem. Na mojej uczelni jest czujnik pomiarowy z wyjsciem rs232. Moim zadaniem jest napisanie programu który będzie pobierał wskazanie czujnika i zapisywał je do okna tekstowego np po wciśnięciu buttona (a najlepiej żeby jeszcze był wyświetlacz aktualnego wskazania). Niestety jestem początkujący w VB i mi to za bardzo nie wychodzi. Dane z dokumentacji czujnika to :4800 baud, parity even, 7bits, 1bit stop. Dodałem do formy 3 buttony, label , timer i mscomm. Ustawiłem właściwości settings kontrolki mscomm1 takie jak w dokumentacji czujnika oraz przepisałem z ksiażki "komputerowe systemy pomiarowe" taki kod:
    
    Private Sub Form_Load()
       Dim wynik
    End Sub
    
    Private Sub konieccmd_Click()
       End
    End Sub
    
    Private Sub startcmd_Click()
       MSComm1.PortOpen = True
       Timer1.Enabled = True
    End Sub
    
    Private Sub stopcmd_Click()
       MSComm1.PortOpen = False
       Timer1.Enabled = False
    End Sub
    
    Private Sub Timer1_Timer()
    'wysłanie z komputera do miernika znaku D , żądanie przesłania wyniku pomiaru
       MSComm1.Output = "D"
    'odczyt danych z portu
       wynik = MSComm1.Input
    'wyslanie wyniku do pola odczytowego
       Label1.Caption = wynik
    End Sub
    Private Sub MSComm1_OnComm()
    'wysłanie z komputera do miernika znaku D , żądanie przesłania wyniku pomiaru
       MSComm1.Output = "D"
    'odczyt danych z portu
       wynik = MSComm1.Input
    'wyslanie wyniku do pola odczytowego
       Label1.Caption = wynik
    End Sub
    

    Niestety z tego calego programu działa chyba jedynie otworzenie portu, bo na końcówce przewodu który wpina się do czujnika zapala się dioda gdy wcisne startcmd i gaśnie gdy wcisnę stopcmd, ale w polu label nie ma wskazania czujnika. Ustawiłem interval timera na 1000 bo w książce nie było sprecyzowane. Czy mógłby ktoś wprowadzić korekty do tego kodu aby spełniał wymagania o których piszę we wstępie postu??. Uprzejmie proszę o pomoc i z góry dziękuje
    pozdrawiam
  • REKLAMA
  • #2 3698067
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Parametry portu ustawiłeś na takie jak w specyfikacji?
    Deklaracja zmiennej wynik powinno raczej być na samej górze.

    Private Sub Timer1_Timer() 
    'wysłanie z komputera do miernika znaku D , żądanie przesłania wyniku pomiaru 
       MSComm1.Output = "D" 
    End Sub 
    
    Private Sub MSComm1_OnComm() 
    'odczyt danych z portu 
       wynik = MSComm1.Input 
    'wyslanie wyniku do pola odczytowego 
       Label1.Caption = wynik 
    End Sub 



    Tu lepiej chyba w ten sposób
    Timer wysyła zapytanie a zdarzenie "OnComm" zwraca informacje.
    Ustaw tez długosc przychodzących danych żeby zdarzenie nastąpiło w odpowiednim miejscu. (pamietaj o rodzaju danych)


    pozdr.
  • REKLAMA
  • #3 3698789
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    albo przerwanie od rs na jeden znak i w przerwaniu dodawać to co przyszło do zmiennej tekstowej. Zmienną kasować przed wysłaniem tego znaku "D".
    W przerwaniu też sprawdzać zawartość zmiennej tekstowej (bufor taki) pod kątem znaku końca tekstu pomiarowego a następnie konwersja, czyszczenie i znowu "D" i tak w kółko.
  • REKLAMA
  • #4 3705048
    mr_egon
    Poziom 11  
    Posty: 15
    hej. Sivex, Szymtro , dzięki za odpowowiedzi. Udało mi się nawiązać połączenie. Użyłem kodu:
    
    Private Sub Command1_Click()
    MSComm1.Output = "rd0" + Chr$(13)
    Do
    dummy = DoEvents()
    Loop Until MSComm1.InBufferCount >= 5
    Text1.Text = Val(MSComm1.Input)
    End Sub
    
    Private Sub Option1_Click()
    MSComm1.PortOpen = True
    End Sub
    
    Private Sub Option2_Click()
    MSComm1.PortOpen = False
    End Sub
    
    

    ale ten kod z mojego pierwszego postu także działa,, tylko ze wskazanie na chwilę się pojawia (pewnie coś z timerem).
    Jednak nie jest to dokładnie to o co mi chodziło, ponieważ wskazanie suwmiarki pojawiaja się w polu label ale dopiero jak ustawię RTSEnable na True i wcisnę na suwmiarce cyfrowej guzik.Wtedy następuje przesłanie wskazania do pola label. Więc za każdym razem muszę wciskać guzik na suwmiarce.Jakiego polecenia użyć aby z komputera wysłać żądanie do suwmiarki aby ta przesłała dane???, bo MSComm1.Output = "D" nie działa, bo jeśli udało by się takie żądanie wysyłać np. co 100ms to miałbym w polu label aktualne wskazanie czujnika. Wie ktoś jak to zrobić??, prosiłbym o wklejenie kodu :). Wiem ze powinno być ustawione DTREnable na True a RTSEnable na False i z kompa wysyłać żądanie do suwmiarki.
    Pozdrawiam
    ps każda minuta się liczy :)
  • #5 3709124
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Jezeli nawiązałeś połączenie z urządzenem, najprawdopodobniej musisz teraz zasięgnąć informacji w specyfikacji tego urządzenia, jakie ma możliwości i jakie przesyła dane.

    pozdr.
REKLAMA