PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Quellcode von Visual Basic 6.0 nach Visual Basic .NET



danionbike
10.07.2007, 06:46
Hallo,

auf Grund eines Beispielprogramms unter VB 6.0 hab ich mir dieses auf meine Anforderungen abgeaendert.
Nun bin ich aber gezwungen VB.NET zu benutzen.
Bei dem Programm werden Daten an der RS232 Schnittstelle eingelesen und verarbeitet.
Ich moechte nur wissen was ich fuer VB.NET aender muss.
Klar dass ich das Benutzerfenster mit den Buttons und der Ein- und Ausgabe neu machen muss, aber mir kommt es hier eher auf die Ansteuerung der RS232 Schnittstelle an.


Hier der Quellcode:



VERSION 5.00

Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "mscomm32.ocx"

Private Sub BtnGetData_Click()

Dim val(1) As Single, min As Single, max As Single

val = TLC548_GetData()

min = val(0)
max = val(1)

Min.Text = CStr(min)
Max.Text = CStr(max)
End Sub


Private Sub Form_Load()
On Error Resume Next
MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
MSComm1.DTREnable = False
MSComm1.RTSEnable = True
BtnGetData.Enabled = False
End Sub

Private Sub Option1_Click(Index As Integer)
On Error Resume Next
BtnGetData.Enabled = False
MSComm1.PortOpen = False
If Option1(0).Value = True Then
MSComm1.CommPort = 1
End If
If Option1(1).Value = True Then
MSComm1.CommPort = 2
End If
MSComm1.PortOpen = True
BtnGetData.Enabled = True
MSComm1.DTREnable = False
MSComm1.RTSEnable = True
End Sub


Private Function TLC548_GetData() As Single

Dim i As Integer, temp As Byte, min As Single, max As Single, values(1) As Single, x As Integer, vref As Single

temp = 0, min = 9999, max = 0

vref = CSng(URef.Text)

MSComm1.RTSEnable = False

For x = 1 To 1000000 Step 1

For i = 7 To 0 Step -1

MSComm1.DTREnable = True

If MSComm1.CTSHolding = True Then
temp = temp + 2 ^ i
End If

MSComm1.DTREnable = False
Next

If (temp * (vref/256)) < min Then
min = (temp * (vref/256))
End If

If (temp * (vref/256)) > max Then
max = (temp * (vref/256))
End If
Next

MSComm1.RTSEnable = False 'set Chip Select high

values(0) = min
values(1) = max

TLC548_GetData = values

End Function




Funktioniert das Ansprechen der RS232 Schnittstelle unter VB.NET noch genauso???
schon mal vielen Dank!

Superhirn
10.07.2007, 16:03
zum portieren gibs nen einfachen trick. wo man nicht sicher weis das es nicht gleich geht lasst man alles 1:1 und kompilliert einfach mal. dann kommen mehrere fehlermeldungen und nach der reihe bügelt sie man aus.
ich hab keine erfahrung mit vb.net. nur das .net programme bei mir (herumspielen in der schule wegen windows zwang) immer langsamer liefen als vb.

marvin42x
10.07.2007, 20:11
Hi danionbike,
zwischen vb6 und .Net gibt es teilweise erhebliche Unterschiede.
Ich habe mich schon mehrfach aus diesem Problem geschlichen in dem ich vb6 Source mit VB2005 Express geöffnet habe.
VB2005 erkennt, dass es sich um VB6 Source handelt und bietet darauf hin eine Konvertierung an.
Dem stimmt man zu und dann findet eine Konvertierung statt.

Am Ende steht ein VB2005 Projektordner mit dem meistens lauffähigen Programm zur Verfügung. Der geänderte Programmtext ist an Stellen die eventuell nicht konvertiert werden konnte mit Kommentaren versehen wie man das Problem lösen kann.

Die RS232 Geschichte ist für VB2005 leider noch nicht so gut mit Beispielprogrammen gesegnet wie das alt ehrwürdige VB6.

VB2005 bringt für alte VB6 Programme sogar eine eigene Kompatibilitätsbibliothek mit.
Langfristig wird es aber vermutlich besser sein vollständig auf VB2005 zu wechseln.

Leider habe ich mich mit RS232 noch nicht speziell beschäftigt und kann Dir die Unterschiede nicht aus dem Ärmel schütteln.

Netter Gruß
http://www.marvins-lab.roboterbastler.de/

danionbike
11.07.2007, 00:28
ihr redet da von VB2005, wir wurde gesagt das die software miscrosoft development environment 2003 Visual Basic.NET Version 7 heisst.

ist das nochmals ein unterschied???

kennt sich jemand mit RS232 unter der von mir geschilderten software umgebung aus?

ein beispielprogramm waere hilfreich.

danke!

CSR
11.07.2007, 08:46
vb2005 ist schon die version 8

gibts als express version kostenlos bei microsoft zum runterladen

chr-mt
11.07.2007, 09:13
Hi,
es gibt auch ein Tool für VB6, mit dem man den Code überprrüfen kann.
Das zeigt auch an, welche Dinge für VB.Net geändert werden müssen.
Das Teil heißt "Code Advisor" und gibt's direkt von Microsoft.

Gruß
Christopher

danionbike
12.07.2007, 00:26
danke fuer die ratschlaege!

gibt es fuer mich einen unterschied zwischen der Version 7 und der Version 8?

funktioniert ein in Version 8 geschriebenes programm auch in version 7 und umgekehrt?

wer noch weitere tipps bezueglich vb.net und rs232 hat - immer her damit!

marvin42x
12.07.2007, 09:06
Der große Umbruch war meinem Wissen nach zwischen VB6 und den folgenden, also .NET, 2003, 2005. Da wurde ein neues Objektorientiertes Datenmodell eingeführt.
Der geschriebene Code benötigt ab da Framework zur Ausführung.
Framework ist ab Vista serienmäßig in Windows enthalten.
Mein Eindruck ist, dass man den Programmierer vom Kern des Betriebssystems fernhalten will um so die Stabilität von Windows zu steigern.

VB2003 und VB2005 sind daher recht kompatibel zueinander weil sie zur neuen Familie gehören.

An einer Demo für das Ansprechen der Seriellen über VB2005 (oder 2003) wäre ich auch interessiert. Also falls es zu einer Lösung kommt bitte die Lösung auch posten.
Es gibt einige VB Internetseiten die eine Menge zu bieten haben (Google suche: VB 2005)

Netter Gruß

danionbike
13.07.2007, 00:28
Der große Umbruch war meinem Wissen nach zwischen VB6 und den folgenden, also .NET, 2003, 2005. Da wurde ein neues Objektorientiertes Datenmodell eingeführt.
Der geschriebene Code benötigt ab da Framework zur Ausführung.
Framework ist ab Vista serienmäßig in Windows enthalten.
Mein Eindruck ist, dass man den Programmierer vom Kern des Betriebssystems fernhalten will um so die Stabilität von Windows zu steigern.

VB2003 und VB2005 sind daher recht kompatibel zueinander weil sie zur neuen Familie gehören.

An einer Demo für das Ansprechen der Seriellen über VB2005 (oder 2003) wäre ich auch interessiert. Also falls es zu einer Lösung kommt bitte die Lösung auch posten.
Es gibt einige VB Internetseiten die eine Menge zu bieten haben (Google suche: VB 2005)

Netter Gruß


dann waeren wir ja schon mal zwei die an einer loesung interessiert sind! :-)

wer wohl heute oder anfang naechster woche das VB.NET 2003 installieren und mir mal angucken ob das bereits geschriebene programm vielleicht doch laeuft und wenn nicht an was es wohl liegen koennte ...

wem sonst noch was einfaellt in hinsicht auf VB.NET 2003 und RS232 ansprechen, der kann das gerne hier posten - DANKE!

EDIT: Gibt es eigentlich von Visual Basic 6.0 eine Freeware-Version oder so aehnlich?

Sternthaler
13.07.2007, 01:14
Hallo zusammen,
da ich selbst 'nur' mit VB6 rummache, kam für mich noch nix mit NET oder weiteren Versionen in Frage.
Gefunden habe ich aber ein 'Muster', unter http://www.gssg.de/visbas.htm
Da nach RS323 suchen oder gleich nach http://www.gssg.de/net_serport.htm gehen, downloaden und probieren.

Hoffe es klappt, da ich mir den Code im Download nicht angesehen habe.
Ich bin im übrigen auch an dem Thema interessiert.

teslapower
18.07.2007, 08:36
rs232 kann man in .net einfach als "Variable" definieren

z.B.



Dim FLASHER5_SerialPort() As SerialPort

Dim x As Int16

ReDim Preserve FLASHER5_SerialPort(0 To PRG_FLASHER5.GetUpperBound(0))

For x = 0 To PRG_FLASHER5.GetUpperBound(0)
If FLASHER5_SerialPort(x) Is Nothing Then ' Wenn Anschluss schon instanziert
FLASHER5_SerialPort(x) = New SerialPort(PRG_FLASHER5(x).PORT, 115200, Parity.Odd, 8, StopBits.One)
FLASHER5_SerialPort(x).Handshake = Handshake.None
FLASHER5_SerialPort(x).ReadBufferSize = 4096
FLASHER5_SerialPort(x).WriteBufferSize = 2024
FLASHER5_SerialPort(x).ReadTimeout = -1
FLASHER5_SerialPort(x).WriteTimeout = -1
End If

......
Public Function open(ByVal ProgIndex As Int16) As Boolean
Dim counter As Int16 = 0
With FLASHER5_SerialPort(ProgIndex)
Do Until .IsOpen
DoEvents()
Try
.Open()
Catch
If counter > 100 Then Return False
counter += 1
End Try
Loop
Return True
End With
End Function

Public Function closeAll() As Boolean
Dim x As Int16

For x = 0 To PRG_FLASHER5.GetUpperBound(0)

Dim counter As Int16 = 0
With FLASHER5_SerialPort(x)
Do Until Not (.IsOpen)
DoEvents()
Try
.Close()
Catch
If counter > 100 Then
FLASHER5_MESSAGES.Enqueue("could not close " & .PortName)
Return False
End If

counter += 1
End Try
Loop
End With

Next x
Return True
End Function

Public Function CmdSend(ByVal stringg As String, ByVal ProgIndex As Int16) As String
With FLASHER5_SerialPort(ProgIndex)
If .IsOpen Then
.WriteLine(stringg & vbCrLf)
'x = Chr(13)
Do While .BytesToWrite > 0
DoEvents()
Loop
Else
FLASHER5_MESSAGES.Enqueue(.PortName & " not open")
Exit Function
End If

Dim x As String = ""
Dim temp() As String
Dim counter As Int16 = 0
Do

Try
DoEvents()
System.Threading.Thread.Sleep(20)
x &= .ReadExisting
If x.Length < 1 Then counter += 1
If counter > 100 Then Return "timeout"

Catch ex As Exception
FLASHER5_MESSAGES.Enqueue(ex.Message)
Return ex.Message
End Try

If x.StartsWith("#NACK" & vbCr) Then Return "failure"

Loop Until x.StartsWith("#ACK" & vbCr & "#") And x.EndsWith(vbCr)

temp = x.Split("#")
x = temp(2).TrimEnd(vbCr)
Return x

End With

End Function
Next x

einfach maln bisschen Codefutter :-)
wenn ihr Fragen zu .net habt kann ich dienen...

teslapower
18.07.2007, 08:41
Ach ja, falls vorhanden nehmt lieber 2005, 2003 ist zum Debuggen sch...
man kann nicht mal den Code zur Laufzeit vernünftig ändern...
2005er .net ist wirklich erste Sahne!
Die Ports in den Codeschnipsel sind übrigens als Array definiert, zwecks Multithreading auf mehreren Schnittstellen gleichzeitig....


MFG teslapower

marvin42x
18.07.2007, 10:29
Danke teslapower. Der Code sieht ja sehr kompetent aus, ich werde das ausprobieren.

Ich arbeite nur mit VB2005 Express, also der Freeware, darum fehlt mir etwas der Vergleich um ein solides Urteil abzugeben. Aber das Debuggen und das Arbeiten mit 2005 empfand ich auch als sehr komfortabel.
Das Ding ist kostenlos und hat für normale Anwendungen keine merkbaren Einschränkungen.

Netter Gruß

marvin42x
23.07.2007, 12:39
Hier habe ich noch was gefunden.
http://www.gssg.de/net_serport.htm

Das ist schon recht aufwendig und läuft unter VB2005

übrigens mal nicht gegoogelt sondern mit www.ask.com
Da gab es interessanter Weise andere Ergebnisse die ich noch nicht kannte.

Netter Gruß

Magier6
30.08.2007, 00:01
Hallo

Ich verfolge diesen Thread nun schon fast von Anfang an und habe ein ähnliches Problem. Ich möchte ein VB.NET 2005 (Version 8.0.5) und Framework 2.0, Program schreiben, das einen I2C-Bus (https://www.roboternetz.de/wissen/index.php/I2C//url) über
RN-I2C-RS232 (https://www.roboternetz.de/phpBB2/viewtopic.php?t=4509//url) Adapter ansteuert. Den VB Code kann man ja nach einigen wenigen Änderungen unverändert nutzen,(ja ich weiß kein guter Stil.....) nur die letzten Functionen die SDL und SDA lesen und setzten bereiten mir Kopfzerbrechen.

Die erste test Function für sieht so aus.


Imports System.IO
Public Class I2C
Private Ob_Port As IO.Ports.SerialPort
Private Int_Delay As Integer = 500

Public Sub New()
Ob_Port = New Ports.SerialPort("COM1")
Try
Ob_Port.Open()
S_I2C_INIT()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Public Sub S_I2C_INIT()
S_I2C_STOP()
S_Delay(Int_Delay)
End Sub
Public Function F_I2C_START() As Boolean
Do

Loop Until (get_sda() = True And get_scl() = True)
set_sda(False)
S_Delay(Int_Delay)
set_scl(False)
S_Delay(Int_Delay)
Return True
End Function

Public Sub S_I2C_STOP()
set_sda(False)
set_scl(True)
Do
If get_scl() = True Then Exit Do
Loop Until get_scl() = True
set_sda(True)
End Sub

Public Sub S_I2C_ACK(ByVal Boo_ACK As Boolean)
If Boo_ACK = True Then
set_scl(False)
S_Pullse()
Else
set_sda(True)
S_Pullse()
S_Delay(Int_Delay)
End If
End Sub

Public Sub i2c_SendByte(ByVal wert As Byte)
Dim i As Integer
Dim bitmask As Byte
bitmask = 128
For i = 1 To 8
set_sda(0)
If (wert And bitmask) > 0 Then
set_sda(1)
Else
set_sda(0)
End If
bitmask = bitmask / 2
S_Delay(Int_Delay)
S_Pullse()
Next i
S_Delay(Int_Delay)
End Sub

Public Function i2c_EmpfangeByte() As Byte
Dim i As Integer
Dim bitmask As Byte
set_sda(1)
i2c_EmpfangeByte = 0
bitmask = 128
For i = 1 To 8
set_scl(1)
empanga:
If get_scl() = 0 Then GoTo empanga
If get_sda() = True Then
i2c_EmpfangeByte = i2c_EmpfangeByte Or bitmask
End If
bitmask = bitmask / 2
set_scl(0)
S_Delay(Int_Delay)
Next i
End Function

Public Function S_Pullse() As Boolean
set_scl(True)
Dim Timeoute As Integer = 0
Do
If Timeoute >= 999999999 Then
Return False
Exit Function
Else
Timeoute = Timeoute + 1
End If
If get_scl() = True Then Exit Do
Loop Until get_scl() = True
set_scl(False)
Return True
End Function

Private Sub S_Delay(ByVal int_Count As Integer)
Dim int_Lauf As Integer
For int_Lauf = 0 To int_Count
Next
End Sub

Public Sub set_sda(ByVal Boo_zustand As Boolean)
Ob_Port.DtrEnable = Boo_zustand
End Sub
Public Sub set_scl(ByVal Boo_zustand As Boolean)
Ob_Port.RtsEnable = Boo_zustand
End Sub

Public Function get_scl() As Boolean
Return Ob_Port.CtsHolding
End Function

Public Function get_sda() As Boolean
Return Ob_Port.DsrHolding
End Function

End Class


Nebenbei, es hat etwas gedauert, eine brauchbare Erklärung zu finden, die einem den Wechsel von MSComm.OCX auf die neuen Framework Funktionen erklären.

Ich öffne also den Port mit

Private Ob_Port As IO.Ports.SerialPort
Ob_Port = New Ports.SerialPort("COM1")
Ob_Port.Open()
und es geht um die Funktionen

Public Sub set_sda(ByVal Boo_zustand As Boolean)
Ob_Port.DtrEnable = Boo_zustand
End Sub
Public Sub set_scl(ByVal Boo_zustand As Boolean)
Ob_Port.RtsEnable = Boo_zustand
End Sub
Public Function get_scl() As Boolean
Return Ob_Port.CtsHolding
End Function
Public Function get_sda() As Boolean
Return Ob_Port.DsrHolding
End Function

Aber mir gelingt es nicht SDA oder SCL auf HIGH zu setzten, hat irgendjemand so etwas schon mal gemacht oder hat ne Idee???

Schon mal Danke!!!!