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;
}
我正在研究 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;
}