Skocz do zawartości

VISUAL BASIC <=> USB


bulee

Polecane posty

Witam

Nie będę owijał w bawełne i od razu przejdę do rzeczy, mianowicie:

czy można w VB stworzyć program który obsługiwać będzie urządzenie pomiarowe skonstruwane przeze mnie, (urządzenie to działać będzie na podobnej zasadzie co mysz komputerowa a dokładniej jej przyciski tzn. dwa oddzielne czujniki dające sygnał do komputera przez port usb).

 

Jak się do tego zabrać ??

 

Jestem początkujący jeżeli chodzi o programowanie, w związku z tym prosiłbym o wyrozumiałość.

Link do komentarza
Udostępnij na innych stronach

Jeżeli Twoje urządzenie USB przesyła dane do komputera to śmiem przypuszczać, że używasz programowego/sprzętowego konwertera RS-232/USB.

Dalej...

W systemie zapewne ukazuje Ci się to urządzenie jako port COM.

Twoim kolejnym krokiem jest napisanie w VB programu do obsługi RS-232 i wybranie portu Twego urządzenia (COM?).

Dalej moje wskazówki się kończą (z uwagi na brak wiedzy o VB).

Pozdrawiam

Prawdziwy programista wiesza sie wraz ze swoim programem.

Link do komentarza
Udostępnij na innych stronach

Rzeczywiscie jest SerialPort, przydałby mi się jakiś przykład z wykorzystaniem SerialPort -u , na którym mógłbym się bazować. Dobrze też byłoby gdyby w przykładzie uwzględnione było wejście oraz wyjscie,

Link do komentarza
Udostępnij na innych stronach

  • 3 weeks later...

Witam ostatnio udało mi się coś stworzyć ale nie do końca chce to działać. Czy mógłby ktoś sprawdzić i powiedzieć co może być nie tak ??

 

  Dim time As New DateTime
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   SerialPort1.PortName = TextBox1.Text    SerialPort1.Open()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
   SerialPort1.WriteLine(TextBox2.Text)End Sub
Public Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Do
           SerialPort1.WriteLine("pinb ?")            TextBox3.Text = SerialPort1.ReadLine
       TextBox3.Text = Val("&h" & TextBox3.Text)
       If TextBox3.Text = Val(&H3B) Then            time = DateTime.Now
           Timer1.Start()        End If
Refresh()
   Loop Until TextBox3.Text = Val(&H3B)
   Do        SerialPort1.WriteLine("pinb ?")
       TextBox3.Text = SerialPort1.ReadLine        TextBox3.Text = Val("&h" & TextBox3.Text)
If TextBox3.Text = Val(&H1F) Then
           Timer1.Enabled = False            Timer1.Stop()
       End If        Refresh()
   Loop Until TextBox3.Text = Val(&H1F)
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
   Dim difference As TimeSpan = DateTime.Now.Subtract(time)      
Label1.Text = difference.Days.ToString & ":" & difference.Hours.ToString & ":" & difference.Minutes.ToString & ":" & difference.Seconds.ToString & "." & difference.Milliseconds.ToString
End Sub

Link do komentarza
Udostępnij na innych stronach

Przepraszam może rzeczywiście nie sprecyzowałem w czym jest problem. Chodzi o to, że fragment kodu powyżej nie działa poprawnie. Generalnie chciałem żeby po odczytaniu danych w tym przypadku Val(&H3B)

wystartował stoper, a po odczytaniu wartości Val(&H1F) zatrzymał odliczanie.

Problemem jest to, że stoper wogóle nie startuje. A na dodatek chciałbbym żeby podczas wykonywania pętli program się nie wieszał. Odwiesza się dopiero po wykonaniu pętli czyli przy odczytaniu wartości

Val(&H1F).

Link do komentarza
Udostępnij na innych stronach

I teraz jaśniej.

Timer działa na komunikatach systemowych, twoja aplikacja nie odbiera komunikatów(dlatego nie reaguje) gdy jest w pętli.

Twoje możliwości:

1) obsługiwać komunikaty w pętli(Nie mam pojecia jak to sie robi w VB)

2) Przenieść pętle do innych wątków

3) (Najprostszy) Zmienić organizację tak, że tworzysz sobie jakąś globalną flage, nazwijmy ją np. isFirst. W procedurze ustawiasz to na true i startujesz timer. Teraz w timerze:

 

BEGIN TIMER

IF isFirst

Wykonaj to co w pętli 1;

Sprawdz czy pętla 1 powina się zakończyć jeśli tak to isFirst = false;

ELSE

Wykonaj to co w pętli 2;

Sprawdz czy pętla 2 powina się zakończyć jeśli tak to zatrzymaj timer

END IF

Wykonaj to co było wcześniej w timeze.

END TIMER

Link do komentarza
Udostępnij na innych stronach

Kombinuje z rozwiązaniem numer 2, ale jak narazie z mizernym skutkiem. Spróbowałem rozdzielić dwie pętle, problem jest taki, że pierwsza pętle startuje wszystko jest ok ale jak przechodzę do drugiej to stoper się wiesza (ale liczy dalej tylko nie widzę jak przeskakują cyferki). Nie bardzo rozumie o co chodzi w rozwiązaniu 3, który prawdopodobnie byłby najrozsądniejszy. Czy można troszkę jaśniej. Powtórze to co pisałem przy zakładaniu tematu.

 

Jestem początkujący jeżeli chodzi o programowanie, w związku z tym prosiłbym o wyrozumiałość.

Link do komentarza
Udostępnij na innych stronach

Kolejna próba:

 

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

 

Do

SerialPort1.WriteLine("pinb ?")

TextBox3.Text = SerialPort1.ReadLine

TextBox3.Text = Val("&h" & TextBox3.Text)

Refresh()

Loop Until TextBox3.Text = Val(&H3B)

 

Timer1.Enabled = True

time = DateTime.Now

Timer1.Start()

 

End Sub

 

 

Klikam "button3" uruchamia się pętla i dopiero po wciśnięciu odpowiedniego guzika czyli po odebraniu danych w tym wypadku Val(&H3B) stoper startuje wszystko ladnie pracuje cyferki przeskakują jest miodzio.

Dla przykładu zrobiłem coś takiego

 

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

 

Do

SerialPort1.WriteLine("pinb ?")

TextBox3.Text = SerialPort1.ReadLine

TextBox3.Text = Val("&h" & TextBox3.Text)

Refresh()

Loop Until TextBox3.Text = Val(&H1F)

 

Timer1.Stop()

Timer1.Enabled = False

End Sub

 

Po wciśnięciu "button4" uruchamiam 2 pętle która ma mi zatrzymać stoper po otrzymaniu sygnału/danych Val(&H1F)

Niestety, jeżeli wchodzę do pętli 2 to od razu stoper staje nie czeka na otrzymanie danych Val(&H1F)

Link do komentarza
Udostępnij na innych stronach

mała modyfikacja i prawie działa tak jak chciałbym żeby działało, ale nie przeskakują cyferki w label1, pokazuje tylko czas jaki upłynał od odebrania Val(&H3B) do Val(&H1F)

 

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

 

Do

SerialPort1.WriteLine("pinb ?")

TextBox3.Text = SerialPort1.ReadLine

TextBox3.Text = Val("&h" & TextBox3.Text)

Refresh()

Loop Until TextBox3.Text = Val(&H3B)

time = DateTime.Now

Timer1.Start()

 

 

Do

SerialPort1.WriteLine("pinb ?")

TextBox3.Text = SerialPort1.ReadLine

TextBox3.Text = Val("&h" & TextBox3.Text)

Refresh()

If TextBox3.Text = Val(&H1F) Then

Timer1.Stop()

Timer1.Enabled = False

End If

Loop Until TextBox3.Text = Val(&H1F)

 

Dim difference As TimeSpan = DateTime.Now.Subtract(time)

Label1.Text = difference.Days.ToString & ":" & difference.Hours.ToString & ":" & difference.Minutes.ToString & ":" & difference.Seconds.ToString & "." & difference.Milliseconds.ToString

 

End Sub

Link do komentarza
Udostępnij na innych stronach

Problem z cyferkami rozwiazany. Poniżej kod. Jedyny problem który mi pozostał to zawieszanie się całej formy tzn. podczas wykonywania pętli nic nie działa. Nie mogę przerwać pętli. Chyba że poprzez urządzenie zewnętrzne , wówczas umieściłbym coś w pętli że jak osiągnie wartość val(xxx) to koniec, ale chciałbym przerwać pętle za pomocą jakiegoś przycisku na formie. Proszę o pomoc kolegów programistów !!

KOD

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

 

SerialPort1.WriteLine("pinb ?")

 

TextBox3.Text = SerialPort1.ReadLine

TextBox3.Text = Val("&h" & TextBox3.Text)

Refresh()

 

Loop Until TextBox3.Text = Val(&H3B)

time = DateTime.Now

Timer1.Start()

 

Do

SerialPort1.WriteLine("pinb ?")

TextBox3.Text = SerialPort1.ReadLine

TextBox3.Text = Val("&h" & TextBox3.Text)

Refresh()

 

 

If TextBox3.Text = Val(&H1F) Then

Timer1.Stop()

Timer1.Enabled = False

End If

Dim differenceq As TimeSpan = DateTime.Now.Subtract(time)

Label1.Text = differenceq.Hours.ToString & ":" & differenceq.Minutes.ToString & ":" & differenceq.Seconds.ToString & "." & differenceq.Milliseconds.ToString

Loop Until TextBox3.Text = Val(&H1F)

 

Dim difference As TimeSpan = DateTime.Now.Subtract(time)

Label1.Text = difference.Hours.ToString & ":" & difference.Minutes.ToString & ":" & difference.Seconds.ToString & "." & difference.Milliseconds.ToString

TextBox4.Text = sek()

 

End Sub

Link do komentarza
Udostępnij na innych stronach

Witam.

 

VB to nie jest moja specjalność, ponieważ nie jest to język ciekawy.

 

Poczytaj o: "Application.DoEvents".

 

Spróbuj dać to w pętli, aby było wykonywane w każdym jej przebiegu.

 

Możesz też zainteresować się wątkami.

 

Pozdrawiam.

Link do komentarza
Udostępnij na innych stronach

Witam

Chciałbym poruszyć jeszcze ten temat a w szczególności wziaść na widelec temat poprawności funkcji do zamiany czasu w formie HH:MM:SS.FFF na same sekundy czyli SS.FFF.

 

Public Function sek() As String

 

 

Dim difference As TimeSpan = DateTime.Now.Subtract(time)

Dim hours As Double

Dim minutes As Double

Dim seconds As Double

Dim mili As String

 

 

hours = difference.Hours.ToString * 3600

minutes = difference.Minutes.ToString * 60

seconds = difference.Seconds.ToString

mili = difference.Milliseconds.ToString / 1000

 

sek = hours + minutes + seconds + mili

 

End Function

 

Głównie chodzi mi o pozycję mili, co będzie jeżeli czas będzie 00:01:23.150 a co w przypadku 00:01:23.015.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...