Forum: PC-Programmierung Serielle Schnittstelle RS232 VBA auslesen mithilfe Visual Studio


von Tufan A. (tufaniho)


Lesenswert?

Hallo Miteinander,

im Rahmen eines Projekts möchte ich einen PowerSupply per Remote-Zugriff 
ansteuern. Dies möchte ich in der Programmiersprache VBA und in der 
Entwicklungsumgebung Visual Studio realisieren. Leider bekomme ich keine 
Antwort vom Netzteil. Hier der Code, den ich bisher benutzt habe:

1
Module Module1
2
    Sub SendSerialData(ByVal data As String)
3
        ' Send strings to a serial port.
4
        Using com4 As IO.Ports.SerialPort =
5
            My.Computer.Ports.OpenSerialPort("COM4")
6
            com4.WriteLine(data)
7
            Console.WriteLine("es wurde folgender Befehl übergeben")
8
            Console.WriteLine(data)
9
            com4.Close()
10
        End Using
11
    End Sub
12
13
    Function ReceiveSerialData() As String
14
        ' Receive strings from a serial port.
15
        Dim returnStr As String
16
17
        Dim com4 As IO.Ports.SerialPort = Nothing
18
        Try
19
            com4 = My.Computer.Ports.OpenSerialPort("COM4")
20
            If com4.IsOpen Then
21
                Console.WriteLine("Port wurde geöffnet")
22
            End If
23
            Do
24
                Console.WriteLine("Einlesen..")
25
                Dim Incoming As String = com4.ReadLine() ' Ab Hier wird nichts mehr ausgegeben.. Keine Daten erhalten
26
                com4.ReadTimeout = 10
27
                If Incoming Is Nothing Then
28
                    Console.WriteLine("Keine Daten erhalten")
29
30
                    Exit Do
31
                Else
32
                    returnStr &= Incoming & vbCrLf
33
                    Console.WriteLine(Incoming)
34
                End If
35
            Loop
36
        Catch ex As TimeoutException
37
            returnStr = "Error: Serial Port read timed out."
38
        Finally
39
            If com4 IsNot Nothing Then com4.Close()
40
        End Try
41
42
        Return returnStr
43
    End Function
44
    Sub Main()
45
        SendSerialData("[:]SYSTem[<channel>]:VERSion?") 'Beispiel um irgendwas vom Netzteil zu erhalten 
46
        Console.WriteLine(ReceiveSerialData())
47
    End Sub
48
49
End Module

Habe ich hier einen Fehler eingebaut den ich nicht sehe?

Ich hoffe Ihr könnt mir weiter helfen

Viel Dank im Voraus

: Verschoben durch User
von nicht"Gast" (Gast)


Lesenswert?

Moin,

"[:]SYSTem[<channel>]:VERSion?"

Damit erhälst du gar nichts vom Netzteil. Das ist kein korrekter Befehl 
und du bekommst auch keine Antwort.
Versuch mal ":SYST:VERS?"


Ach, wäre nicht schlecht mal zu verraten, was du für ein Netzteil 
benutzt. Könnte irgend wie wichtig sein.


leicht OT. mit dem VS kann man kein VBA programmieren. Das ist der 
Dialekt, der in Excel und Co implementiert ist. VBA steht für Visual 
Basic for Applications. Deine Programmiersprache heißt Visual Basic.

Bevor die Meckerer vor kommen. Das ist wie Java und JavaScript zu 
vergleichen.

von nicht"Gast" (Gast)


Lesenswert?

Und wieder....


du solltest den Port zwischendrin nicht zumachen. Dann landen die Daten 
vom Netzteil sowieso mit hoher Warscheinlichkeit im Nirwana. Im 
Eingangspuffer landen sie nur, wenn der Port auf ist.

von Tufan A. (tufaniho)


Lesenswert?

Hallo,

Danke erstmal für deine Antwort.
Das Netzteil heißt: PCE Power Control A12KW 40-300

Leider habe ich auch auf :SYST:VERS? keine Antwort bekommen,
auch nachdem ich das com4.close() entfernt habe.

Gibt es denn eine bessere Möglichkeit dieses Netzteil anzusteuern?

Gruß,

Tufaniho

von nicht"Gast" (Gast)


Lesenswert?

Ja,

versuche erst mal mit einem Terminal Programm verbindung aufzunehmen.

Z.Bsp Realterm eignet sich da ganz gut. Wenn das klappt, kannst du das 
dann nachprogrammieren.


Linending ist übrigens \r und nicht \r\n. Stell das mal um.

von Tufan A. (tufaniho)


Lesenswert?

Also,

ich kann mittlerweile Befehle an das Netzteil senden,
welche auch vom Netzteil erkannt werden. Das einzige
was nicht funktioniert ist, dass er keine Strings einlesen
kann. Er läuft immer bis zur Readline-Methode und da bleibt
er auch.

Das Netzteil sendet sicher Informationen zurück, denn wenn ich
den Befehl :SYST:ERR? ausführe, werden auf dem Netzteil-Display
alle Error-Meldungen gelöscht.

Lese ich im falschen format aus ? Oder ist die Readline-Methode
hier nicht geeignet?

Gruß,

Tufaniho

von Tufan A. (tufaniho)


Lesenswert?

Hallo,

das Problem wurde gelöst.

Für die, die es interessiert:

Dadurch,dass 2 Funktionen aufgeruft werden, ist die Zeit die dabei 
vergeht
länger als die Antwortzeit des Netzteils.

Lösung: Nur eine Funktion, die beides gleichzeitig abhandelt

Gruß,

Tufaniho

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.