2016-12-06 4 views
0

Я считаю, что это должно быть ОЧЕНЬ просто, но у меня возникло ощущение, что он не работает. Я использую Arduino для отправки «O» и «C» в последовательный порт. Я хочу выполнить sub, когда отправляется «O», а другой - при отправке «C». Я могу подтвердить, что «O» и «C» посылаются, и строки с помощью этого:Сравните серийный ввод для выполнения действия

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

я ожидал, чтобы быть в состоянии взять эту строку и запустить подпрограмму я хотел , основанный на том, являются ли данные = «O» или «C». но я не в состоянии сделать это на всех .. Я не могу получить эту работу (проблема что-то с выбором-сазом):

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

Я не понять, почему простое сравнение строк не работает. Спасибо за любую помощь в этом.

+0

Проверьте, содержит ли 'data' более одного символа. Если он имеет завершающий пробел или непечатаемый символ, вы не заметите его, когда будете отображать его в «MessageBox» в тестовом примере. – Blackwood

+0

Хорошо. Я не думал об этом. Я добавил остановку в конце этого Суб и наблюдал за местными жителями. у него были данные «O» и vbCr. Мне нужно узнать, что теперь означает vbCr, но я сделал это для своего кода, и теперь он работает. – Sloan

+0

Private Sub SerialPort1_DataReceived (отправитель As Object, е Как IO.Ports.SerialDataReceivedEventArgs) Ручки данные SerialPort1.DataReceived Dim As String = SerialPort1.ReadLine() Select Case данных Case "O" и vbCr открытым() Case " C "& vbCr close() End Select End Sub – Sloan

ответ

0

vbCr является символом «возврат каретки», который указывает конец линии. Если вы знаете, что перед vbCr всегда есть один символ, вы можете использовать метод SubString, чтобы ваш Select Case проверял только этот символ.

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 

Если данные, возвращаемые не гарантируется один символ (плюс vbCr), то вам нужно больше кода, но код, который нужно будет зависит от того, что возможные значения.

0

Если вы просто отправляете одного персонажа серийному хосту из Arduino, отправьте его Serial.print('C') вместо Serial.println('C'). Таким образом, Arduino отправит только персонажа, на который вы хотите посмотреть, и опустите два новых байта строки.