Daten an Com-Port vor Drucker über MSCom32.ocx und VB6 abfangen

  • VB6

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von MatthiasKraemer.

    Daten an Com-Port vor Drucker über MSCom32.ocx und VB6 abfangen

    Hallo alle zusammen,
    ich habe folgendes Problem:

    Wir haben an einer Produktionsanlage einen Epson LX-300 Nadeldrucker, um bestimmte Daten zu dokumentieren.
    Jedesmal, wenn eine neue Messung durchgeführt wurde, werden die Daten direkt über eine COM-Schnittstelle an den
    Drucker gesendet und ausgedruckt. Das Problem ist, dass es immer mal wieder zum Papierstau kommt. Alle dann ausgedruckten
    Daten sind einfach unwiederbringlich verloren. Deshalb möchte ich zwischen Anlage und Drucker einen Rechner stellen, der alle Daten
    zunächst sammelt und diese dann am Ende der Produktion ausgedruckt werden können.

    Kann ich diese Daten einfach mit VB6 über das MSCom32.ocx abfangen und auslesen?
    Zum Beispiel so:

    [font='&quot']Dim Eingang As String[/font]
    [font='&quot'] Select Case MSComm1.CommEvent[/font]
    [font='&quot'] Case comOverrun: MsgBox "Datenverlust!"[/font]
    [font='&quot'] Case comRxOver: MsgBox "Datenverlust!"[/font]
    [font='&quot'] Case comEvReceive: Eingang = Eingang + MSComm1.Input[/font]
    [font='&quot'] End Select[/font]


    Sind die ankommenden Daten so direkt als Text lesbar?


    Vorab schonmal vielen Dank für eure Hilfe,
    Hallo,
    vielen Dank für eure Tipps.
    Es funktioniert jetzt, dass ich Daten von einem Rechner an einen anderen Rechner sende.
    Allerdings kommen die Daten nicht so an, wie ich sie weggeschickt habe.
    Wenn ich das Wort "Test" versende, kommt zum Beispiel nur das Zeichen à an.

    Was muss ich denn jetzt noch tun, um die Daten korrekt zu empfangen,
    so dass sie auch lesbar sind?
    Hast du auch das richtige Kabel genommen? Ein NullModem Kabel wo die Leitungen Rx und Tx gekreuzt sind, damit Tx (Senden) vom Gerät auf Rx (Empfangen) am Pc geht und umgekehrt?

    Ansonsten sollte so eine Man-in-the-Middle Anwendung nicht weiter kompliziert sein. Wobei das mit dem .NET-Framework noch deutlich komfortabler lösen lässt.
    Ich habe früher mal in VB6 und dem Comport gearbeitet und zwar NUR Senden, das ist noch relativ simpel, aber Empfangen ist in VB6 beschissen zu Managen, da stellt das .NET Framework definitiv bessere Klassen durch verfügung die man nutzen kann.

    Daten werden jetzt empfangen, allerdings fehlen die letzten Zeichen und die Formatierung stimmt nicht

    Hallo,
    danke euch für eure Hilfe. Ich habe es jetzt hinbekommen, die Daten in Klartext zu empfangen.
    Ich habe jetzt nur noch zwei kleine Probleme.

    Ich zeige im ersten Schritt die empfangenen Daten in einem Textfeld an.
    Zum Start des Prozesses wird ein größerer Text von der Anlage übertragen.
    Hier habe ich festgestellt, dass die letzten paar Wörter fehlen.
    Ich denke, dass ich irgendeinen Parameter des Comm32 Steuerelements anders einstellen muss, weiß aber nicht
    welchen. Ich habe ein bisschen mit .RThreshold rumprobiert und diesen Wert jetzt mal auf 50 gestellt.
    Irgendwie führt es aber nicht wirklich zum Erfolg.


    Mein zweites Problem ist die Formatierung.
    An ganz undefinierten Stellen werden Zeilenumbrüche eingefügt, so dass der Text in dem Textfeld gar nicht mehr so aussieht,
    wie er weggeschickt wurde.

    Hat hierzu jemand eine Idee, wie ich diese beiden Probleme lösen kann?
    Zwar nix zu deinem Problem, aber du musst dich nicht für jeden Post hier in deinem Thread bedanken, sondern die Funktion ist nur dafür da wenn dir ein Beitrag maßgeblich zum Lösen deines Problems geholfen hat und ich bin mir sicher das nicht jeder Beitrag darunter fällt.
    So ganz ohne Code schwer zu beantworten. Wenn was verloren geht, reicht entweder der Puffer nicht aus, oder du löschst ihn, nachdem schon wieder Daten eingetroffen sind. Also Puffer hochsetzen und / oder Abarbeitungsroutine optimieren.

    Zu deinem 2. Problem brauchen wir (zumindest ich) den Code... Threshold auf 50 würde heissen, dass alle 50 Zeichen das Empfangsereignis ausgelöst wird. Im schlimmsten Fall fehlen Dir also 49 Zeichen, da diese noch im Puffer hängen.

    Ich empfange immer per Timer. Regelmäßig wird geprüft, ob sich was im Buffer befindet und wenn ja, dann wird dessen Inhalt an die Empfangsvariable angehängt und bei einem bestimmten Zeichen (chr(13)) wird abgeschnitten und die Auswerteroutine bekommt das Abgeschnittene zum Verarbeiten. Für mich (den Anwendungsfall) "Unnützes" wie chr(10) filtere ich beim Empfang schon raus.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo Peterfida,
    danke für den Tipp. Ich habe jetzt die InBufferSize mal auf 1000 gesetzt. Jetzt kann ich alles komplett empfangen.
    Bedeutet das jetzt, dass 1000 Zeichen in dem Puffer geschrieben werden können?

    Zu dem Punkt Threshold = 50: Hier habe ich den RThreshold auf 50 gesetzt, damit 50 ankommende Zeichen
    empfangen werden können. Soweit ich weiß, wird über diesen Parameter die Anztahl der Zeichen festgelegt, die in den Empfangspuffer übernommen werden. Oder ist das so nicht korrekt?

    Kann es sein, dass du von dem Parameter SThreshold geschrieben hast? Ich dachte, dass SThreshold festlegt,
    ab dem wievielten Zeichen das Empfangsereignis ausgelöst wird. Ich habe deshalb SThreshold auf 0 stehen, damit
    die ankommenden Daten immer sofort übernommen werden.


    Was mit beim Empfangen der Daten aufgefallen ist, ist die Tatsache, dass diese offenbar in mehreren Teilen
    empfangen werden.
    Ich möchte nämlich nach jedem emfangenen Datensatz eine Leerzeile haben, damit es etwas übersichtlicher wird.
    Beim ersten Datensatz, der immer zu Beginn einer Produktion geschickt wird und daher etwas größer ist,
    werden an mehreren Stellen einfach Zeilenumbrüche eingefügt, wo eigentlich gar keine hinsollen.

    Bei den eigentlichen Datensätzen, die mit 3 Zeilen deutlich kürzer sind, scheint es zu funktionieren.
    Woran kann das liegen? Ist das auch irgendeine Einstellung, die ich noch vornehmen muss?


    Hier ist mal der Code, mit dem ich zunächst das Com-Control initialisiere:

    Private Sub Form_Load()
    'Initialisierung des Formulares
    Form1.Caption = "Biotest"
    Label1.Caption = "AS18 Messdatenerfassungssystem"
    Text1.Text = ""

    With MSComm1
    .CommPort = 3
    .Handshaking = 2 - comRTS
    .InBufferSize = 500 'Festlegung der Größe des Empfangspuffers auf 1000 Zeichen
    .InputLen = 0 'Durch InputLen = 0 wird der gesamte Inhalt des Empfamgspuffers gelesen

    .RThreshold = 50 'Anzahl der Zeichen, die in den Empfangspuffer übernommen werden
    .RTSEnable = True
    .Settings = "9600,n,8,1"
    .SThreshold = 0
    .PortOpen = True
    End With

    End Sub


    und hier ist der Code, mit dem ich die empfangenen Daten verarbeite:


    Sub HandleInput(InBuff As String)
    Dim Empfangene_Daten As String

    'Verarbeitung des empfangenen Textes.
    'Dieser wird zunächst in das Textfeld "Text1" geschrieben
    Text1.SelStart = Len(Text1.Text)
    Text1.SelText = InBuff


    'Gesamten empfangenen Text in eine Textdatei schreiben
    Empfangene_Daten = InBuff

    Open App.Path + "\Empfangene_Daten_AS18.txt" For Append As #1
    Print #1, Empfangene_Daten
    Close #1


    'Empfangenen Text an Drucker weiterleiten
    Printer.Print Empfangene_Daten
    Printer.EndDoc

    End Sub