Преобразование 3 перемешанных байтов в два 12-битных целых числа в C # - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь прочитать данные с последовательного порта, используя C #.

Обычные байты в целые числа или числа с плавающей запятой и bools не являются проблемой.Тем не менее, есть одна последовательность из 3 байтов, которые перемешиваются, и я не могу заставить ее правильно проанализировать.

Эти 3 байта представляют 2 беззнаковых 12-разрядных целых числа, один для MainSupplyDC, один для питания двигателя.Они перетасовываются так, что перед синтаксическим анализом их нужно переупорядочить.

Моя последняя попытка закончилась примерно так, но теперь я снова понял, что это не может быть правильно.

    // Main Supply DC
    int MainSupplyDCval = (byte2 >> 4 | byte1);

    // MotorPower
    int MotorPowerVal = (byte3 << 4 | byte2);

Я не знаю, как правильно сдвинуть его.

Вот схема последовательности байтов:

enter image description here

то же самое в тексте:

    Byte1    |         Byte2            |    Byte3
------------------------------------------------------
  Lowbyte    |  4 Lowbit | 4 Highbit    |   Highbyte
MainSupplyDC | MotorPower| MainSupplyDC |  MotorPower

Примеры последовательности байтов:

E5-00-00
MainSupplyDC expected around 230
MotorPower expected 0

E4-A0-06
MainSupplyDC expected around 230
MotorPower expected about 97

E5-90-0F
MainSupplyDC expected around 230
MotorPower expected about 190

Уже 2 дня стучу по голове, просто не могу заставить ее работать ...

РЕДАКТИРОВАТЬ

Кажется, что есть два способа интерпретации данной таблицы.В моем случае у @ canton7 был правильный ответ, но я думаю, что если бы поставщик / производитель закодировал другой путь, у @dumetrulo был бы правильный ответ.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Если я правильно прочитал таблицу, следующий метод должен помочь:

public static (int, int)
Get12BitValues(byte d1, byte d2, byte d3) =>
    ((int)d1 | ((int)d2 >> 4),
    ((int)d3 << 4) | ((int)d2 & 0x0f));

Тогда ваши два значения будут получены следующим образом:

var (v1, v2) = Get12BitValues(byte1, byte2, byte3);
float MainSupplyDCval = (float)v1 / 10.0f;
float MotorPowerVal = (float)v2 / 10.0f;
0 голосов
/ 21 февраля 2019

Я предполагаю, что эти два 12-битных значения имеют эту структуру?

MainSupplyDC (low byte) | MainSupplyDC (4 Highbit)
MotorPower (4 lowbit) | MotorPower (Highbyte)

В этом случае:

var bytes = new byte[] { 0xE4, 0xA0, 0x06 };
int mainSupplyDc = bytes[0] | ((bytes[1] & 0x0F) << 8);
int motorPower = (bytes[1] >> 4) | (bytes[2] << 4);
Console.WriteLine("MainSupplyDC: {0}, MotorPower: {1}", mainSupplyDc, motorPower);

Отпечатки:

MainSupplyDC: 228, MotorPower: 106

Это выглядит правильно?

...