Member 10201357 Ответов: 3

Ошибка считывания шестнадцатеричного значения из последовательного порта


уважаемый друг,
Я пишу вам,чтобы попытаться решить проблему, я посылаю некоторое шестнадцатеричное значение с помощью последовательного порта на внешнее устройство.
Он отвечает на мой запрос статуса , но вместо того, чтобы показать значение 0x01 в середине пакета данных, он показывает 0x00.
Я использую простой vb.net winform на VS2012.
Вот код который я использую:

Imports System
Imports System.IO
Imports System.IO.Ports
Imports System.Text
Imports System.Threading


Public Class Form1

    
    Dim value As Byte
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SerialPort1.Encoding = System.Text.Encoding.GetEncoding(1252)
    SerialPort1.Open()

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        SerialPort1.Close()
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim array(6) As Byte
        array(0) = &H3
        array(1) = &H1
        array(2) = &H1
        array(3) = &HA4
        array(4) = &HA5
        array(5) = &HB2
        SerialPort1.Write(array, 0, array.Length)
        Label1.Text = ""
      
        For i = 0 To 10
            value = SerialPort1.ReadByte()
            Label1.Text += value.ToString("x2") + " "
        Next
    End Sub



Я получаю это :
03 01 01 A4 A5 B2 00 00 03 00 FC

Но как из технических данных устройства я должен получить:
03 01 01 A4 A5 B2 01 00 03 00 FC


Используя сниффер порта, я вижу, что устройство правильно отвечает со значением 0x01.
У кого-то есть идея, почему из моего приложения я читаю байт 6 как 0x00, а не 0x01?
Проблема, по-видимому, только со значением 0x00 и 0x01 ....другие значения считываются правильно(я полагаю).

Заранее спасибо

Маурицио

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

Используя последовательный порт com sniffer, полученные байты являются правильными.

Richard MacCutchan

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

Richard MacCutchan

Хорошо подмечено. Я знал, что видел это где-то раньше, но количество сообщений на домашней странице OP равно нулю.

Member 10201357

Извините, я должен был разместить его не в том разделе.

3 Ответов

Рейтинг:
2

OriginalGriff

Самое лучшее предположение - и без всей вашей системы, это все, что может быть - это предварительно буферизованные данные.
Последовательные порты буферизуют полученные байты, поэтому, если ваше удаленное устройство отправляет сообщение, которое вы не обрабатываете, оно останется в буфере класса SerialPort до тех пор, пока вы его не прочтете.

Затем, когда вы отправляете свое новое сообщение, ответ, который Вы читаете, был более ранним сообщением, а не последним.
Попробуйте очистить буфер перед отправкой данных на устройство и посмотрите, поможет ли это.


Member 10201357

Спасибо за ответ,но буфер полностью чист, на данный момент я запускаю приложение и отправляю только один раз статус устройства request...no еще команды.

Сегодня днем я буду использовать отладчик, как предложил Ричард Маккатчан, чтобы захватить больше информации.

Рейтинг:
0

Member 10201357

Используя отладчик VS,как было предложено, я обнаружил проблему, из моего кода последовательный порт отправил 7 байт (последний со значением 0x00), а не 6 байт, как было объявлено.
Правильный код-это:

Dim array(5) As Byte
array(0) = &H3 
array(1) = &H1 
array(2) = &H1 
array(3) = &HA4 
array(4) = &HA5 
array(5) = &HB2 
SerialPort1.Write(array, 0, array.Length)


Довольно странный...от 0 до 5 есть 6 байт...а не 5, Как я должен объявить...
.
Устройство использовало один провод для связи в полудуплексном режиме..ведущий отправил 0×00 и в то же время ведомый ответ со значением 0x01...результат 0x00, а затем остальную часть пакета состояния....
....

Спасибо Вам за помощь

С уважением
Маурицио


Richard Deeming

Массивы внутри VB.NET объявляются с использованием верхней границы массива, а не количества элементов в массиве. Это было сделано для обратной совместимости с кодом VB6, хотя это имеет меньше смысла, когда вы не можете изменить нижнюю границу массива.

array(5) представляет собой массив из 6 элементы, имеющие индексы от 0 к 5.

Рейтинг:
0

Member 10201357

Используя отладчик VS,как было предложено, я обнаружил проблему, из моего кода последовательный порт отправил 7 байт (последний со значением 0x00), а не 6 байт, как было объявлено.
Правильный код-это:

Dim array(5) As Byte
array(0) = &H3 
array(1) = &H1 
array(2) = &H1 
array(3) = &HA4 
array(4) = &HA5 
array(5) = &HB2 
SerialPort1.Write(array, 0, array.Length)


Довольно странный...от 0 до 5 есть 6 байт...а не 5, Как я должен объявить...
.
Устройство использовало один провод для связи в полудуплексном режиме..ведущий отправил 0×00 и в то же время ведомый ответ со значением 0x01...результат 0x00, а затем остальную часть пакета состояния....
....

Спасибо Вам за помощь

С уважением
Маурицио


Richard Deeming

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