C#读取,存储和组合数组

时间:2014-01-24 13:51:31

标签: c# arrays

我正在进行RS232通信工作,但一直遇到我正在处理的一些数组的问题。

在下面的例子中,我发出一个“命令”,意图在一个名为“FirstFour”的新数组中读取并存储命令的前4个字节。对于每个运行的循环执行,我还想将整数“i”转换为十六进制值。然后我打算将“FirstFour”和“iHex”数组组合成一个标记为“ComboByte”的新数组。下面是我的代码到目前为止,但它似乎没有工作。

private void ReadStoreCreateByteArray()
    {
        byte[] Command = { 0x01, 0x02, 0x05, 0x04, 0x05, 0x06, 0x07, 0x08};

        for (int i = 0; i < 10; i++)
        {
            //Send Command
            comport.Write(Command, 0, Command.Length);

            //Read response and store in buffer
            int bytes = comport.BytesToRead;
            byte[] Buffer = new byte[bytes];
            comport.Read(Buffer, 0, bytes);

            //Create 4 byte array to hold first 4 bytes out of Command
            var FirstFour = Buffer.Take(4).ToArray();

            //Convert i to a Hex value
            byte iHex = Convert.ToByte(i.ToString());

            //Combine "FirstFour" and "iHex" into a new array
            byte [] ComboByte = {iHex, FirstFour[1], FirstFour[2], FirstFour[3], First Four[4]};
            comport.Write(ComboByte, 0, ComboByte.Length);

         }
    }

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

数组基于零,所以......

byte [] ComboByte = {iHex, FirstFour[0], FirstFour[1], FirstFour[2], First Four[3]};

...应该给你FirstFour的前4个元素。

答案 1 :(得分:1)

首先,您需要来处理来自Read操作的返回值。以下模式适用于各种API,包括SerialPortStream等:

static void ReadExact(SerialPort port, byte[] buffer, int offset, int count)
{
    int read;
    while(count > 0 && (read = port.Read(buffer, offset, count)) > 0)
    {
        count -= read;
        offset += read;
    }
    if (count != 0) throw new EndOfStreamException();
}

所以:你有一个方法可以读取可靠的字节数 - 然后你应该能够重复使用一个缓冲区并按顺序填充它:

byte[] buffer = new byte[5];
for (int i = 0; i < 10; i++)
{

    //...
    buffer[0] = (byte)i;
    ReadExact(port, buffer, 1, 4);
}

除了决定是同步还是异步读取之外,BytesToRead属性基本没用,因为它不会告诉您是否有更多数据迫在眉睫。使用现有代码,无法保证至少有4个字节。