我正在进行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);
}
}
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
数组基于零,所以......
byte [] ComboByte = {iHex, FirstFour[0], FirstFour[1], FirstFour[2], First Four[3]};
...应该给你FirstFour的前4个元素。
答案 1 :(得分:1)
首先,您需要来处理来自Read
操作的返回值。以下模式适用于各种API,包括SerialPort
,Stream
等:
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个字节。