UWP C# UART 数据缓冲区使用数组还是列表?

UWP C# UART data buffer to use Array or List?

我正在研究 UART-RS485。数据以字节为单位发送。我已经使用 array 测试了 hard-coded 代码。但是,我想了解如何在动态问题中使用数组,因为数据包大小可能会有所不同。

 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());它抛出如下异常;

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

我不确定它是什么意思以及如何克服它。

例如。

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

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