1

私はこれがBitConverter.ToUInt16wiorksのやり方に関係していると感じていますが、これがなぜ私にファンキーなデータを与えているのかを私は一生理解できません。

ポートに入る最初の2ビットを無視し、残りのビットを16ビットの符号なし整数に変換する必要があります。

配列を逆にしたり、マスクを逆にしたり、両方を行ったり、さまざまな変換を行ったり、あらゆる種類の奇妙なことを試しました。

入ってくる2バイトは、最初のバイトが最も重要です。最初のバイトの最初の2ビットは設定解除する必要があります。

誰かが私を正しい方向に向けることができますか?

byte[] buffer = new byte[2];
int count = port.Read(buffer, 0, buffer.Length);

Console.WriteLine("0: {0}", BitConverter.ToString(buffer));

ushort value = BitConverter.ToUInt16(buffer, 0);

Console.WriteLine("1: {0}", value);

value = (ushort)(value & 0x3FFF);

Console.WriteLine("2: {0}", value);

BitConverter.ToUInt16を使用してから、0x3FFFマスクとAND演算を行った場合のサンプルデータを次に示します。

0: 80-00
1: 128
2: 128 <-- this should be 0

0: 80-00
1: 128
2: 128 <-- should be 0

0: 01-00
1: 1
2: 1 <-- should be 1, as it is

0: 80-00
1: 128
2: 128 <-- should be 0

0: 80-00
1: 128
2: 128 <-- should be 0

配列を逆にすると、次のようなデータが得られます。

0: 00-01
1: 256
2: 256 <-- should be 1

0: 01-80
1: 32769
2: 1 <- not sure what this should be, probably 1 though
4

2 に答える 2

1

入ってくる 2 バイトは、最初のバイトが最も重要です。

それが問題です。BitConverter.ToUInt16最初のバイトを最下位として扱います。これは、システムがそのように動作するためです。を参照してくださいBitConverter.IsLittleEndian

配列を逆にしてみましたが、

それはうまくいくはずです。または、 を使用せずに 2 バイトを手動で結合しますBitConverter

于 2013-01-09T06:44:58.180 に答える
0

シリアル ポートの読み取りと 14 ビットの符号なしビッグ エンディアン整数の変換のための完全なコードを人々が入手できるようにするためです。

private static void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort port = sender as SerialPort;
    if (port.BytesToRead < sizeof(ushort))
    {
        return;
    }

    byte[] buffer = new byte[2];
    int count = port.Read(buffer, 0, buffer.Length);

    ushort value = (ushort)(((buffer[0] << 8) | buffer[1]) & 0x3FFF);
    Console.WriteLine(value);
}
于 2013-01-09T07:41:15.433 に答える