2016-12-06 12 views
0

Ich glaube, das sollte SEHR einfach sein, aber ich habe mir den Kopf zerbrochen, warum es nicht funktioniert. Ich verwende ein Arduino, um ein "O" und ein "C" an die serielle Schnittstelle zu senden. Ich möchte ein Sub durchführen, wenn "O" gesendet wird, und ein anderes Sub, wenn "C" gesendet wird. Ich kann bestätigen, dass „O“ und „C“ gesendet werden, und sind Strings durch diese Verwendung:Vergleichen Sie die serielle Eingabe, um die Aktion auszuführen

Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 
 
     Dim data As String = SerialPort1.ReadLine() 
 
     MessageBox.Show(data) 
 
     MessageBox.Show(data.GetType.ToString) 
 
    End Sub

ich erwartet, dass die Zeichenfolge nehmen zu können und führen Sie das Unterprogramm wollte ich basierend darauf, ob Daten = "O" oder "C" sind. aber ich bin das nicht in der Lage zu tun, überhaupt .. Ich kann das nicht an der Arbeit (das Problem etwas mit der select-case-Anweisung ist):

Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 
 
     Dim data As String = SerialPort1.ReadLine() 
 
     Select Case data 
 
      Case "O" 
 
       open() 
 
      Case "C" 
 
       close() 
 
     End Select 
 
    End Sub

Ich verstehe nicht, warum Der einfache String-Vergleich funktioniert nicht. Danke für jede Hilfe mit diesem.

+0

Überprüfen Sie, ob 'data' aus mehr als einem einzelnen Zeichen besteht. Wenn es ein nachstehendes Leerzeichen oder ein nicht druckbares Zeichen hat, würden Sie es nicht bemerken, wenn Sie es in Ihrem Testfall in der "MessageBox" anzeigen. – Blackwood

+0

Ok. Ich habe nicht daran gedacht. Ich habe am Ende dieses Subs einen Halt gemacht und die Einheimischen beobachtet. es hatte "O" & vbCr für Daten. Ich muss jetzt lernen, was & vbCr bedeutet, aber ich habe das mit meinem Code gemacht und jetzt funktioniert es. – Sloan

+0

Private Sub SerialPort1_DataReceived (Absender als Gegenstand, e As IO.Ports.SerialDataReceivedEventArgs) Griffe SerialPort1.DataReceived Dim Daten As String = SerialPort1.ReadLine() Select Case Daten Fall "O" & vbCr open() Fall " C "& vbCr schließen() Ende wählen End Sub – Sloan

Antwort

0

vbCr ist das Zeichen "Wagenrücklauf", das das Ende der Linie anzeigt. Wenn Sie wissen, dass vor dem vbCr immer ein Zeichen steht, können Sie mit der SubString-Methode Ihr Select Case nur dieses Zeichen prüfen lassen.

Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 
    Dim data As String = SerialPort1.ReadLine() 
    Select Case data.SubString(0, 1) 
     Case "O" 
      open() 
     Case "C" 
      close() 
    End Select 
End Sub 

Wenn die Daten, die zurückgegeben wird, ist nicht garantiert ein Zeichen (plus vbCr) sein, werden Sie mehr Code benötigen, aber der Code, den Sie brauchen würde, hängt davon ab, was die möglichen Werte sind.

0

Wenn Sie nur ein Zeichen vom Arduino an den seriellen Host senden, senden Sie es mit Serial.print('C') anstelle von Serial.println('C'). Auf diese Weise sendet das Arduino nur das Zeichen, das Sie betrachten möchten, und lässt die zwei neuen Zeilenbytes weg.

Verwandte Themen