Проблема в C# чтении четырех байтов беззнакового двоичного числа из последовательного порта - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь написать GUI в C# для сопряжения ПЛИС с P C через UART. На стороне FPGA я использую 32-битный тип данных без знака:

data_to_uart            :   out unsigned(31 downto 0);
data_to_uart            <= to_unsigned(1000, 32);

Затем data_to_uart в моей конструкции FPGA переходит к блоку, который разбивает эти 32-битные без знака на 4 байта и отправляет их один за другим через UART. Поэтому в терминале я получаю следующее (значение должно быть: 1000):

00000000 00000000 00000011 11101000

Моя проблема: как правильно прочитать эти четыре байта в c#, используя System.IO.Ports ; и преобразовать его в int (для выполнения математических операций), а затем в строку - для отображения значения на этикетке.

В настоящее время я использую:

inputData = serialPort1.ReadExisting();

Следующие: Пример преобразования двоичного числа в десятичное у меня не работает, потому что .ReadExisting возвращает строку: (

Я посмотрел на это:

Документы Microsoft - метод SerialPort

Нужно ли мне использовать метод SerialPort.ReadByte? Там заявлено, что он читает только один байт, как прочитать все четыре, а затем преобразовать в int?

Я использую: Baud скорость - 115200, 8 бит и один стоп-бит.

Спасибо за внимание и, возможно, несколько советов.:)

1 Ответ

1 голос
/ 01 мая 2020

Как говорили другие, вы должны использовать протокол. Но чтобы ответить на вопрос:

    if (serialPort1.ReadBufferSize >= 4)
    {
        var buffer = new byte[4];
        for (int i = 3; i >= 0; --i)
            buffer[i] = (byte)serialPort1.ReadByte();
        int myNumber = BitConverter.ToInt32(buffer, 0);
    }

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

...