UWP C # Буфер данных UART для использования массива или списка?

Я работаю над UART-RS485. Данные отправляются в байтах. Я тестировал жестко запрограммированный код, используя array. Однако я хотел бы узнать, как использовать массив в динамическом вопросе, поскольку размер пакета данных может отличаться.

 Task<UInt32> storeAsyncTask;

 byte[] data = { 0xF5, 0x81, 0x66, 0x0F, 0x00, 0x6B }; 
 dataWriteObject.WriteBytes(data);

 storeAsyncTask = dataWriteObject.StoreAsync().AsTask();

 UInt32 bytesWritten = await storeAsyncTask;

Пожалуйста, помогите, спасибо.

Обновлено: недавно я пытался использовать bitconverter, но это не сработало. Не знаю, где я ошибся.

        Task<UInt32> storeAsyncTask;

        BitConverter.GetBytes(F5).CopyTo(data, 0);
        BitConverter.GetBytes(TxAddress).CopyTo(data, 1);
        BitConverter.GetBytes(TxCommand).CopyTo(data, 2);
        BitConverter.GetBytes(TxData).CopyTo(data, 3);
        BitConverter.GetBytes(~TxData).CopyTo(data, 4);

        TxChkSum = 0;

        foreach (byte a in data)
        {
            TxChkSum += a;
        }

        BitConverter.GetBytes(TxChkSum).CopyTo(data, 5);

        dataWriteObject.WriteBytes(data);

        storeAsyncTask = dataWriteObject.StoreAsync().AsTask();

        UInt32 bytesWritten = await storeAsyncTask;

Обновление 23-01-2020

Я пробовал использовать метод list, но addrange данные добавляются в диапазоне 2 байта (16 бит) вместо одного байта (8 бит), где связь RS485, с которой я взаимодействую, передается побайтно. Могу я узнать, как это обойти?

введите описание изображения здесь

Вторая проблема заключается в том, что в dataWriteObject.WriteBytes(data.ToArray());it генерируется исключение, как показано ниже;

"Object reference not set to an instance of an object."

введите описание изображения здесь

Я не уверен, что это значит и как с этим справиться.

eg.

byte F5 = 0xF5;
byte TxCommand= 0x66
byte TxData = 0x0F

        try
        {
            List<byte> data = new List<byte>();

            data.AddRange(BitConverter.GetBytes(F5));
            data.AddRange(BitConverter.GetBytes(TxAdr));
            data.AddRange(BitConverter.GetBytes(TxCommand));
            data.AddRange(BitConverter.GetBytes(TxData));
            data.AddRange(BitConverter.GetBytes(~TxData));

            TxChkSum = 0;

            foreach (byte a in data)
            {
                TxChkSum += a;
            }
            data.AddRange(BitConverter.GetBytes(TxChkSum));

            dataWriteObject.WriteBytes(data.ToArray());

            Task<UInt32> storeAsyncTask;
            storeAsyncTask = dataWriteObject.StoreAsync().AsTask();

            UInt32 bytesWritten = await storeAsyncTask;
        }
        catch (Exception ex)
        {
            MainStatusDisplay.Text = ex.Message;
        }

person mylim    schedule 22.01.2020    source источник


Ответы (1)


BitConverter.GetBytes - это используется для преобразования базовых типов данных в массив байтов и массива байтов в базовые типы данных. См. Следующий код.

            byte[] data = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00  };

            double aDouble = 0.11;
            BitConverter.GetBytes(aDouble).CopyTo(data, 0);

После вызова метода CopyTo массив данных будет заполнен этим результатом.

0x29 0x5c 0x8f 0xc2 0xf5 0x28 0xbc 0x3f 0x00 0x00

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

            List<byte> data = new List<byte>();

            data.AddRange(BitConverter.GetBytes(F5));
            data.AddRange(BitConverter.GetBytes(TxAddress));
            data.AddRange(BitConverter.GetBytes(TxCommand));
            data.AddRange(BitConverter.GetBytes(TxData));
            data.AddRange(BitConverter.GetBytes(~TxData));

            TxChkSum = 0;

            foreach (byte a in data)
            {
                TxChkSum += a;
            }

            data.AddRange(BitConverter.GetBytes(TxChkSum));

            dataWriteObject.WriteBytes(data.ToArray());

ОБНОВЛЕНИЕ: Фактически, в вашем сценарии нет необходимости преобразовывать байтовые данные с помощью BitConverter. Вы можете попробовать использовать следующий код.

            List<byte> data = new List<byte>();

            data.Add(F5);
            data.Add(TxAddress);
            data.Add(TxCommand);
            data.Add(TxData);
            data.Add(~TxData);

            TxChkSum = 0;

            foreach (byte a in data)
            {
                TxChkSum += a;
            }
person Michael Xu - MSFT    schedule 22.01.2020
comment
Привет, @ MichealXu-MSFT. Спасибо ... Я попробовал метод list, но столкнулся с проблемой добавления ... Я обновил сообщение ... Я не уверен, как это решить ... Не могли бы вы посоветовать. - person mylim; 23.01.2020
comment
@mylim, убедитесь, что объект dataWriteObject инициализирован, ошибка означает, что объект dataWriteObject имеет значение null. Я обновил ответ. - person Michael Xu - MSFT; 30.01.2020