シリアル接続を介して長距離無線から入力を受信するアプリケーションを作成しています。現在、SerialPort C# クラスを使用してデータを送受信していますが、いくつか問題があります。データを受信するための関数がバッファ バイト配列サイズを正しく設定していないことに気付きました。すべてのデータはバイトコード (16 進数) で送信されます。
他のノードが 103 バイトのデータを送信するとします。コードをステップ実行し、「Read()」行にブレークポイントを設定すると、「serialPort1.BytesToRead-1」が 103 に評価されることがわかりますが、byte[] 配列は 17 にしか初期化されません。この動作については説明がありません。 . その結果、最初の 17 バイトだけが配列に入れられます。ステップ スルーを続けると、この同じイベントがトリガーされます。今回は "serialPort1.BytesToRead-1" が 85 に評価されます (おそらく、103 バイトのうち最初の 17 バイトだけが読み取られたためです。
データ配列のサイズを 103 にハードコアすると、1 回のパスで問題なく動作します。ただし、現時点では、バイト配列のすべてのデータを 1 回のパスで格納することができず、多くの問題が発生しています。私のバイト配列がこのような任意のサイズに初期化されている理由を知っている人はいますか???
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] data = new byte[serialPort1.BytesToRead - 1];
serialPort1.Read(data, 0, data.Length);
DisplayData(ByteToHex(data) /*+ "\n"*/);
}
更新:これが私が試みている新しい方法です。isHeader は、最初に true に設定されたブール値です (パケットから受信される最初の 2 バイトが実際にはパケットの長さであるため)。
const int NUM_HEADER_BYTES = 2;
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] headerdata = new byte[2];
if (isHeader)
{
serialPort1.Read(headerdata, 0, NUM_HEADER_BYTES);
int totalSize = (headerdata[0] << 8 | headerdata[1]) >> 6;
serialPort1.ReceivedBytesThreshold = totalSize - NUM_HEADER_BYTES;
data = new byte[totalSize - NUM_HEADER_BYTES];
isHeader = false;
}
else
{
serialPort1.Read(data, 0, data.Length);
double[][] results = ParseData(data, data.Length);
serialPort1.ReceivedBytesThreshold = NUM_HEADER_BYTES;
isHeader = true;
DisplayData(ByteToHex(data) /*+ "\n"*/);
}
}