UWP C# UART буфер данных для использования массива или списка? - PullRequest
0 голосов
/ 22 января 2020

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

 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, с которой я взаимодействую, передается в байтовом байте. Могу ли я узнать, как обойти это?

enter image description here

2-й вопрос заключается в том, что при dataWriteObject.WriteBytes(data.ToArray()); выдается исключение, как указано ниже;

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

enter image description here

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

например.

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;
        }

1 Ответ

1 голос
/ 22 января 2020

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;
            }
...