COM ポート経由でパケットを受信しています。各パケットは {0xFF, 0xFF} で始まり、{0xFE, OxFE} で終わります。受信したすべてのバイトはキューに入れられ、そのキューを処理するQueue<byte>
たびに処理されます。void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
パケットに 0xFF または 0xFE が含まれている場合、デバイスはその後に 0x00 を追加します。
- 各パケットを抽出する方法は?
- 内部にヘッダー バイトがある各パケット内の不要な 0x00 を削除するにはどうすればよいですか?
私が持っている最初の問題について:
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] data = new byte[port.BytesToRead];
try
{
port.Read(data, 0, data.Length);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
data.ToList().ForEach(newByte => receivedData.Enqueue(newByte));
processData();
}
private void processData()
{
// Determine if we have a "packet" in the queue
if (Enumerable.SequenceEqual(receivedData.Take(2), new List<byte> { 0xFF, 0xFF }))
{
// Beginning of new packet in the front of queue is ready!
if (Enumerable.SequenceEqual(receivedData.Skip(Math.Max(0, receivedData.Count() - 2)).Take(2), new List<byte> { 0xFE, 0xFE }))
{
List<byte> tempPacket = new List<byte>();
// Whole packet in the queue
while(receivedData.Count > 0)
tempPacket.Add(receivedData.Dequeue());
tempPacket.TrimExcess();
Packet pack = new Packet(tempPacket, PacketOrigin.Serial);
}
}
}
Queue<byte>
これまでに見つけた 0xFE と 0xFF の後にあるすべての 0x00 を削除しようとしています:
List<byte> unconvertedPacket = new List<byte> { 0xFF, OxFF, 0x00, 0x00,0x4D, 0xFA 0xFE, 0x00, 0x01, 0x00, 0x03, 0xFE, 0xFE}
int index = 0;
while (index != null)
{
unconvertedPacket.RemoveAt(index + 1);
index = unconvertedPacket.IndexOf(0xFE);
}
while (index != null)
{
unconvertedPacket.RemoveAt(index + 1);
index = unconvertedPacket.IndexOf(0xFF);
}
誰かがそれを行うための他の解決策/アドバイスを持っていますか?