Forum: PC-Programmierung VB 2008 Fehler abfangen und abarbeiten?


von Sebastian Förster (Gast)


Lesenswert?

Hallo,

hab schon lange kein Visual Basic mehr "programmiert"... Wollte mir 
jetzt aber für ein Projekt nen kleines Programm zusammenstellen, dass 
mir ein paar Daten auf den Microcontroller läd. So weit so gut, klappt 
alles wunderbar...
Nur bekomm ich von Visual Basic nen Fehler zurück, wenn jemand nen com 
Port auswählt der nicht gültig ist. Ich möchte dieses Fehler jetzt 
abfangen und behandeln. Ich hab nur noch keine Idee wie. Ich weiß nur 
das es mal so etwas gab wie: On Error resum next oder der gleichen.

Hier der Code:

           RS232.PortName = COMPORT.Text
           RS232.Open()


Dann hab ich noch ein zweites kleines Problem. Ich lese aus einer 
Textbox eine Zahl und multipliziere sie mit 1024 und versuche diese Zahl 
in mein RS232 Protokoll zu schieben, also Wandle ich sie erst in ein 4 
stelliges Byte arryer um. Das funktioniert auch wunderbar. Leider nicht 
bei allen Zahlen. Was ich mir nicht so richtig erklären kann. Also bei 
100*1024 gehts, aber bei 99*1024 bekomm ich den Fehler, dass ich 
versuche durch 0 zu teilen. Was aber nicht der Fall ist!


Hier der Code:

      Dim kp_l As Integer

           Dim kp_b(3) As Byte

           kp_l = Int((kp * 1024))
           kp_b(3) = Int(kp_l \ (2 ^ 24))
           kp_b(2) = Int(kp_l \ (2 ^ 16))
           kp_b(1) = Int(kp_l \ (2 ^ 8)) '<-- hier zeigt es den Fehler 
an
           kp_b(0) = kp_l Mod (2 ^ 8)

Hab irgendwo gelesen das Integer bei VB 2008 nun 32 Bit breit ist... 
also daran das kp_l überläuft kanns doch nicht liegen, oder?


Wie gesagt, die zwei Fehler müsste ich noch beseitigen, ansonten steht 
die Kommunikation zum Microcontroller wie ne eins!
Besonders erfreulich ist es, wie schnell man so ein Windowsprogramm 
zusammengeschoben bekommt und wie schnell die UART Kommunikation steht.

Grüße

Basti

von Frank (Gast)


Lesenswert?

Ich programmiere zwar RealBasic und nicht VB, aber ich denke, dass die 
Kommunikation mit dem COM-Port systembedingt ähnlich sein müsste. Du 
solltest den Namen des Ports nicht frei eingeben lassen, sondern vorher 
die Namen der vorhandenen Ports abfragen. Ausserdem ist es bestimmt 
"sauberer" über die interne Port-Nummer zu geben un dnicht über den 
Namen.

In RB sieht das z.B. so aus:

for i=0 to system.serialport.count-1
 list.addrow str(i)+"-"+system.serialport(i).name
next

(list ist eine Listbox)

Und dann so etwa:

if serialport(i).open then
 serialport(i).write("bla bla ...)
end if

Gibst sowas in VB nicht?

Gruß, Frank

von Sebastian Förster (Gast)


Lesenswert?

Hi Frank...

das geht sicherlich... aber ich würde es besser finden den Fehler 
abzufangen... Es kann ja auch passieren das jemand wärend mein Programm 
geladen ist, den USB zu RS232 Adapter abzieht und an ein anderen USB 
ansteckt... dann ändert sich bei mir z.B. die Com Adresse und schwupp 
hab ich wieder den Ausnahmefehler...

Würde es andersrum doch eher vorziehen und sauberer finden...

für die Com Ports zur Auswahl, hab ich ne Combobox gemacht, mit 16 Com 
Ports, aber man darf seinen eigenen auch eingeben, wenn man möchte...

von Arc N. (arc)


Lesenswert?

Sebastian Förster schrieb:
> Hallo,
>
> hab schon lange kein Visual Basic mehr "programmiert"... Wollte mir
> jetzt aber für ein Projekt nen kleines Programm zusammenstellen, dass
> mir ein paar Daten auf den Microcontroller läd. So weit so gut, klappt
> alles wunderbar...
> Nur bekomm ich von Visual Basic nen Fehler zurück, wenn jemand nen com
> Port auswählt der nicht gültig ist. Ich möchte dieses Fehler jetzt
> abfangen und behandeln. Ich hab nur noch keine Idee wie. Ich weiß nur
> das es mal so etwas gab wie: On Error resum next oder der gleichen.
>
> Hier der Code:
>
>            RS232.PortName = COMPORT.Text
>            RS232.Open()
1
 
2
Try 
3
    RS232.Open()
4
Catch e As Exception
5
End Try
http://msdn.microsoft.com/en-us/library/aa289505(VS.71).aspx

> Hier der Code:
>
>       Dim kp_l As Integer
>
>            Dim kp_b(3) As Byte
>
>            kp_l = Int((kp * 1024))
>            kp_b(3) = Int(kp_l \ (2 ^ 24))
>            kp_b(2) = Int(kp_l \ (2 ^ 16))
>            kp_b(1) = Int(kp_l \ (2 ^ 8)) '<-- hier zeigt es den Fehler
> an
>            kp_b(0) = kp_l Mod (2 ^ 8)

Mit der BitConverter-Klasse geht das etwas einfacher
1
Dim kp_b As Byte( ) = BitConverter.GetBytes(kp_l)
2
' andere Richtung wäre
3
kp_l = BitConverter.ToInt32(kp_b, 0)

von Basti M. (counterfeiter)


Lesenswert?

Wunderbar... funktionert beides hervorragend...

Danke an den Visual Basic Speziallisten!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.