Announcement

Collapse
No announcement yet.

SerialPortListener

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SerialPortListener

    Hallo Leute,
    ich benutze den SerialPortListener zu ersten Mal und habe prompt ein Problem mit ihm. Und zwar habe ich eine (alte) Maschine die Teststreifen ausliest und das Ergebnis dann ausdruckt. Diese Maschine soll nun per seriellem Kabel an einen PC angeschlossen werden und die Daten so weiter verarbeitet werden. Vom Hersteller gibt es auch eine teure Software dafür, die man kostenlos testen kann. (Dabei werden die Werte allerdings verfälscht.) Dadurch weiß ich, dass die Maschine funktioniert und über das Kabel Werte liefert. Außerdem weiß ich mit Bestimmtheit, dass es sich um COM1 handelt, denn das ist in den Optionen des Testprogramms ausgewählt.
    Mein Code:
    Code:
        Public Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
            SerialPort1.PortName = "COM1"
            Try
                SerialPort1.Open()
            Catch ex As Exception
                MessageBox.Show("Fehler beim Öffnen von COM1")
            End Try
    
        End Sub
    
        Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            MessageBox.Show("SerialPort1_DataReceived")
            Dim buffer() As Byte = New Byte() {}
            Dim bufSIZ As Integer
            bufSIZ = SerialPort1.BytesToRead
            MessageBox.Show(bufSIZ.ToString())
            Array.Resize(buffer, bufSIZ)
            SerialPort1.Read(buffer, 0, bufSIZ)
            Dim message As String = System.Text.Encoding.UTF8.GetString(buffer, 0, bufSIZ)
            rtb.Text = message
        End Sub
    Leider wird die SerialPort1_DataReceived Methode nie aufgerufen. Ich habe es (u.a.) noch mit der Lösung vonhttp://www.dreamincode.net/forums/to...tion-in-vbnet/ versucht, bekomme dort aber auch nichts zurück geliefert. Habe schon überlegt ob die Maschine irgendwie abfragt ob das Originalprogramm des Herstellers am anderen Ende des Kabels ist und erst dann Daten liefert, aber dann müsste ja trotzdem irgendwas ankommen und die Methode aufgerufen werden. Hat jemand eine Idee was ich falsch mache?

  • #2
    Du meinst die SerialPort Klasse oder? Einen SerialPortListener kenne ich nicht. Das Wort Listener macht da auch wenig Sinn da es natürlich Kommunikation in beide Richtungen geben kann.

    a.) Hast du die SerialPort Klasse richtig eingestellt (Baudrate, Parity, Handshake etc.) ?

    b.) Kennst du das Protocol (wenn es denn ein spezielles gibt) das zwischen Gerät und PC ~gesprochen~ wird? Vielleicht sendet dein Gerät nicht einfach auf dem seriellen Port sondern nur auf Anforderung durch die Gegenstelle.

    Edit:

    [Highlight=VB.Net]rtb.Text = message[/Highlight]

    Das wird höchstwahrscheinlich nicht funktionieren. Ich gehe mal davon aus das rtb ein UI Control ist. rtb gehört damit zum Hauptthread. Der DataReceived Event wird aber in einem anderen Thread aufgerufen. Du musst also einen synchronisierten Aufruf durchführen sonst gibt es eine entsprechende Exception wegen eines threadübergreifendem AUfrufs.
    Zuletzt editiert von Ralf Jansen; 31.05.2012, 13:07.

    Comment


    • #3
      Ja, meine ich. Listener habe ich das Projekt genannt...

      a) Ich habe ein paar (ich hoffe die gängigsten) Einstellungen von Baudrate und Parity ausprobiert. Leider kenne ich von dem Gerät in der Hinsicht nichts. Im Handbuch steht nichts und im Internet ist auch nichts zu finden. Kann ich aus Deiner Frage schließen, dass "DataReceived" nicht aufgerufen wird, sobald eine Einstellung nicht richtig ist? Kann man irgendwie die Einstellungen herausfinden? A la "zeichne auf was am Port ankommt und probiere dann aus welche Einstellung sinnvolle Daten liefert"?

      b) Also dass das Programm beim öffnen des COM1 etwas sendet, was beim Gerät das senden einschaltet? Kann ich das herausbekommen? Sozusagen einen sniffer einsetzen?

      Comment


      • #4
        Als erstes würde ich mal Hyperterminal anschmeissen und schauen ob dort was an kommt. Wenn Du dort schon nichts siehst brauchst Du es erst gar nicht mit Code versuchen.

        Comment


        • #5
          Ist Hyperterminal nicht gerade dabei mit XP zu sterben?

          Alternativ geht zum Beispiel realterm. Ich meine aber Microsoft (Sysinternals) hat da auch was in petto.

          Comment


          • #6
            Das werde ich ausprobieren... hoffentlich am WE...

            Comment

            Working...
            X