Sleeper 11888211 Ответов: 2

Вопрос о типе данных последовательного порта


Я написал простую программу для связи через Bluetooth с Arduino. Программа открывает последовательный порт, подключается к порту Bluetooth на Arduino и посылает одиночные символы (x,y,z)при нажатии клавиш. Поскольку Arduino выполняет функции, определенные клавишами, эта часть работает нормально.

Я хотел, чтобы плата возвращала символ клавиши, которая была нажата для доставки команды, поэтому у меня есть Arduino Serial.write back, что она, по-видимому, и делает. Я читаю данные с помощью этого кода:

Private Sub SerialPort1_DataReceived(ByVal sender As System.Object,
                                         ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                                         Handles SerialPort1.DataReceived
        If SerialPort1.IsOpen Then
            Try
                readBuffer = SerialPort1.ReadLine()
                'data to UI thread 
                Me.Invoke(New EventHandler(AddressOf DoUpdate))
            Catch ex As Exception
                MsgBox("read " & ex.Message)
            End Try
        End If
    End Sub


    ' update received string in UI 

    Public Sub DoUpdate(ByVal sender As Object, ByVal e As System.EventArgs)

        ' rtbMonitor.Text = SerialPort1.BytesToRead
        If readBuffer.Contains("y") Then

            rtbMonitor.Text = "contains the letter y"  'this is the result
        Else
            rtbMonitor.Text = readBuffer
        End If

If readBuffer.Equals("y") Then

            rtbMonitor2.Text = "the letter y"  
        Else
            rtbMonitor2.Text = readBuffer  ' y is the result
        End If


Что я уже пробовал:

Я хочу использовать возвращаемый символ для некоторых других функций, однако тип данных ускользает от меня. С другой стороны, я не уверен в том, что посылается обратно из Arduino. Я думал, что если я прочитаю буфер, как указано выше, то будет возвращена простая строка "y". По-видимому, буфер содержит "y", но не равен"y". Y кажется текстом (строкой); он не читается как символ. Итак, вопрос в том, что находится в буфере (readBuffer), кроме "y", и как я могу его прочитать? Данных отправляется очень мало. Просто нажатие клавиши каждые несколько секунд.

Richard Deeming

Поэтому отладьте свой код и проверьте значение переменной. Это строка длины 1, содержащий ровно одну строчную букву "y", без пробелов или других символов?

У нас нет доступа к вашей системе, поэтому мы не можем отлаживать ваш код для вас.

Sleeper 11888211

Спасибо. Я постараюсь прочитать его байт за байтом и посмотреть, что это даст. Я решил, что есть и другие невидимые персонажи. Указатели всегда приветствуются для этого любителя.

2 Ответов

Рейтинг:
4

cvogt61457

Если вы используете System.ИО.Портах.Последовательный порт, то последовательный порт.Найдите ждет пр, которые будут получены. Если CR отсутствует, то по истечении периода тайм-аута должно быть вызвано исключение TimeoutException.

Вы получаете исключение TimeoutException?

Попробуйте вместо этого использовать SerialPort.ReadByte, чтобы прочитать один байт. Проверьте SerialPort.BytesToRead и цикл чтения всех байтов.

Кроме того, посмотрите на SerialPort.ReceivedBytesThreshold - установите его в 1, чтобы получить событие для каждого байта. Если вы установите значение 1, Ваша способность обрабатывать байты ограничена, поэтому не отправляйте очень много байтов.

Извините, VB.Net это не мой основной язык программирования

If SerialPort1.IsOpen Then
    Try
        Dim byteCount as Int = SerialPort1.BytesToRead
        Dim i as Int
        Dim data as Int
        For i = 1 to byteCount
            data = SerialPort1.ReadByte()
            If data <> -1 Then
                'data to UI thread
                Me.Invoke(New EventHandler(AddressOf DoUpdate))
            End If
        Next
    Catch ex As Exception
        MsgBox("read " & ex.Message)
    End Try
End If


Sleeper 11888211

Спасибо! Я не профессионал - это мое хобби!

Рейтинг:
18

Patrice T

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.

С помощью ReadLine() подразумевается получение строки, Если вам нужны символы, используйте функцию, которая читает 1 символ за раз.