Member 12292743 Ответов: 1

Простое шестнадцатеричное преобразование в десятичное


Option Strict On
Imports System.IO.Ports

    Dim q As Queue(Of Byte) = New Queue(Of Byte)

    Private Sub SerialPort1_DataReceived(ByVal sender As Object,
        ByVal e As SerialDataReceivedEventArgs) _
        Handles SerialPort1.DataReceived
        While SerialPort1.BytesToRead > 0
            q.Enqueue(CByte(SerialPort1.ReadByte))
        End While
    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
        SyncLock q
            While q.Count > 0
                Dim B As Byte = q.Dequeue
                tbRx.Text &= Hex(B) & " "
            End While
        End SyncLock
    End Sub
    Private Sub btnStop_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnStop.Click
        SerialPort1.Close()
        Timer1.Stop()
    End Sub

НЕ ПОЛНЫЙ КОД
В tbRx, если температура составляет что-то вроде 21,3 градуса Цельсия, я вижу значение 4 BD. Однако мне нужно другое текстовое поле, дающее десятичное значение (оттуда я могу затем преобразовать его в температуру).

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

я пробовал что-то вроде Textbox1. text = B
но это безнадежно неправильно.

1 Ответов

Рейтинг:
1

OriginalGriff

Из этого не очевидно, в каком формате передаются значения, поступающие от вашего датчика температуры: 4 BD в простейшем преобразовании 4BD Hex == 1213 Dec, что подразумевает, что это может быть "Градусы C плюс 100 раз 10", но из одного образца вы не можете достоверно сделать такой вывод.

Поэтому поговорите с производителем (или, по крайней мере, проверьте их веб-сайт на наличие документации) и посмотрите, объясняют ли они точно, что отправляется и как оно должно быть преобразовано.
Мы не можем сделать это для вас!


Member 12292743

хорошо, я хочу знать, как получить 1213 в текстовом поле 1, тогда я смогу получить температуру оттуда

OriginalGriff

Вы получаете данные в виде двух байтов, да?
Поэтому обрабатывайте его как два байта, а не пытайтесь преобразовать их в два отдельных элемента.
Помните, что 16-битное число - это два восьмибитных числа:
int16 = (высокий байт * 256) + низкий байт
Если вы сделаете это, а затем преобразуете значение int16 в строку, вы получите 1213 - но я очень сомневаюсь, что это действительно то значение, которое вам нужно: вам нужно посмотреть документацию для фактического устройства, угадывание здесь не будет надежным!

Member 12292743

да, чтобы получить фактическое значение, вычтите 1000 из 1213, а затем разделите на 10