我正在开发一个C#程序,它将使用三菱通信协议与VFD进行通信。
我正在准备几种方法来创建一个要发送的字节数组。
现在,我已经输入了更多用于准备和发送字节的强力方法。
public void A(Int16 Instruction, byte WAIT, Int32 Data )
{
byte[] A_Bytes = new byte[13];
A_Bytes[0] = C_ENQ;
A_Bytes[1] = 0x00;
A_Bytes[2] = 0x00;
A_Bytes[3] = BitConverter.GetBytes(Instruction)[0];
A_Bytes[4] = BitConverter.GetBytes(Instruction)[1];
A_Bytes[5] = WAIT;
A_Bytes[6] = BitConverter.GetBytes(Data)[0];
A_Bytes[7] = BitConverter.GetBytes(Data)[1];
A_Bytes[8] = BitConverter.GetBytes(Data)[2];
A_Bytes[9] = BitConverter.GetBytes(Data)[3];
Int16 SUM = 0;
for(int i = 0; i<10; i++)
{
SUM += A_Bytes[i];
}
A_Bytes[10] = BitConverter.GetBytes(SUM)[0];
A_Bytes[11] = BitConverter.GetBytes(SUM)[1];
A_Bytes[12] = C_CR;
itsPort.Write(A_Bytes, 0, 13);
}
然而,对此事情似乎非常低效。特别是我经常调用GetBytes()的事实。
这是一个好方法,还是一个更短/更快的方法?
主要更新:
事实证明,三菱结构对于它如何做到这一点有点不知所措。它不使用字节,而是使用ascii字符。因此,当ENQ仍然是0x05时,E1的指令代码实际上是0x45和0x31。
这可能会让事情变得更容易。
答案 0 :(得分:0)
即使不改变你的算法,这也可以更高效,更像c#。如果将两个阵列联合起来困扰你,那当然是可选的。
var instructionBytes = BitConverter.GetBytes(instruction);
var dataBytes = BitConverter.GetBytes(data);
var contentBytes = new byte[] {
C_ENQ, 0x00, 0x00, instructionBytes[0], instructionBytes[1], wait,
dataBytes[0], dataBytes[1], dataBytes[2], dataBytes[3]
};
short sum = 0;
foreach(var byteValue in contentBytes)
{
sum += byteValue;
}
var sumBytes = BitConverter.GetBytes(sum);
var messageBytes = contentBytes.Concat(new byte[] { sumBytes[0], sumBytes[1], C_CR } );
itsPort.Write(messageBytes, 0, messageBytes.Length);
我建议,如果你发现自己编写了很多这样的代码,那就考虑把它包装成Message
类。此代码将构成构造函数的基础。然后,您可以使用继承(或组合)改变行为(使事情更长,更短等),并将消息作为对象而不是字节数组处理。
顺便提一下,使用BinaryWriter
而不是BitConverter
(可能是?)可能会看到利润增加,但使用起来更麻烦。 (byte)(sum >> 8)
也是另一种选择,我认为它实际上是最快的,并且可能在你的用例中最有意义。