我使用以下代码发送API框架:
byte[] bytesToSend5 = new byte[]
{
0x7E, 0x00, 0x10, 0x01, 0x00, 0x13,
0xA2, 0x00, 0x40, 0xA6, 0x5E, 0x23,
0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04, 0x4D
};
serialPort1.Write(bytesToSend5, 0, bytesToSend5.Length);
它像这样分开:
byte[] bytesToSend5 = new byte[]
{
5Startbits(won't change),
8IDbits(changes when a part of the device is swapped),
6determinationbits(tells the device what to do),
1checksumbit(calculated based on previous bits)
};
第一个代码示例适用于当前产品。无论出于何种原因,如果需要更改器件的一部分,它将无法工作,因为ID位不适合。 ID号码印在设备上,16位数字和字母,例如“0013A20043A25E86”。
我想要做的是创建一个文本框,用户可以在其中输入新的ID号,它将被上述字节数组中的相应位替换。
这是我尝试使用Array.Copy函数,尝试在文本框中显示结果 - 但未检测到任何更改。我尝试输入“1”“1,2,3”等以及实际ID“0013A20043A25E86”:
string xbee_serienr = prop1_serienr.Text;
byte[] front = { 0x7E, 0x00, 0x10, 0x17, 0x01 };
byte[] back = { 0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04 };
string[] xbee = { xbee_serienr };
byte[] combined = new byte[front.Length + xbee.Length + back.Length];
Array.Copy(front, combined, front.Length);
Array.Copy(back, 0, combined, 5, back.Length);
var result = string.Join(",", combined.Select(x => x.ToString()).ToArray());
OutputWindow.Text = result;
必须能够根据用户输入更改8ID位,并根据其余位计算最后一个校验和位。
我搜索了互联网并尝试了Array.copy,Concat等,但我没有取得任何进展。对此的任何指导或意见都将受到高度赞赏,即使这意味着指导我采取不同的方法。
编辑:
我现在在字节数组“result”中使用与下面大致相同的示例获得所需信息(获取var“xbee_serienr”的用户输入)。我现在想把它传递给一个看起来像这样的方法:
private void button_D07_Lav_Click(object sender, EventArgs e)
{
byte[] bytesToSend5 = new byte[] { 0x7E, 0x00, 0x10, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0xA6, 0x5E, 0x23, 0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04, 0x4D };
serialPort1.Write(bytesToSend5, 0, bytesToSend5.Length);
并使“bytesToSend5”使用来自其他方法的数组“result”。
我尝试过使用this示例,如下所示:
byte result { get; set; } //above and outside of the two methods
var result = string.Join(string.Empty, combined.Select(x => x.ToString("X2")).ToArray()); //this is the end of the first method
private void button_D07_Lav_Click(object sender, EventArgs e)
{
byte[] bytesToSend5 = new byte[] { 0x7E, 0x00, 0x10, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0xA6, 0x5E, 0x23, 0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04, 0x4D };
bytesToSend5 = result; //using the array stored in result instead of the one currently in bytesToSend5.
serialPort1.Write(bytesToSend5, 0, bytesToSend5.Length);
}
我在这里意识到明显的问题,它不是在同一个形式上。这就是为什么我想拆分数组并在数组中的每个项目前添加0x,并用逗号分隔它们。
一旦我弄清楚了,我也会将它用于几个不同的设备,这让我担心会有很多重复的代码,但我怀疑一旦我理解了如何传递和使用数组在不同的方法中,我总是可以“复制”每个设备的代码,因为不同设备的ID确实需要不同。
答案 0 :(得分:1)
好吧,你永远不会添加解析后的字符串。
var xbee_serienr = "0013A20043A25E86";
byte[] front = { 0x7E, 0x00, 0x10, 0x17, 0x01 };
byte[] back = { 0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04 };
var xbee = new byte[xbee_serienr.Length / 2];
for (var i = 0; i < xbee.Length; i++)
{
xbee[i] = byte.Parse(xbee_serienr.Substring(i * 2, 2), NumberStyles.HexNumber);
}
byte[] combined;
using (var ms = new MemoryStream(front.Length + xbee.Length + back.Length))
{
ms.Write(front, 0, front.Length);
ms.Write(xbee, 0, xbee.Length);
ms.Write(back, 0, back.Length);
combined = ms.ToArray();
}
var result = string.Join(string.Empty, combined.Select(x => x.ToString("X2")).ToArray());
由于您要逐个添加多个数组,我只使用了MemoryStream
。如果你已经准备好byte[]
(并且可变),你可以直接写入该字节数组并避免分配(和收集)额外的数组,但是当限制因素是限制因素时,它并没有多大区别。用户界面无论如何。