为串行传输准备数据的最佳方法是什么?

时间:2015-04-26 21:12:45

标签: c# serial-port

我正在开发一个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。

这可能会让事情变得更容易。

1 个答案:

答案 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)也是另一种选择,我认为它实际上是最快的,并且可能在你的用例中最有意义。