1

我有一种感觉,这与BitConverter.ToUInt16wiorks 的方式有关,但我一生都无法弄清楚为什么这会给我带来时髦的数据。

我需要忽略端口上的前两位并将其余位转换为 16 位无符号整数。

我尝试过反转数组,反转我的掩码,同时进行不同的转换以及各种奇怪的事情。

进来的两个字节是第一个是最重要的。第一个字节中的前两位需要取消设置。

有人可以指出我正确的方向吗?

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掩码进行 ANDing 时的一些示例数据。

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

进来的两个字节是第一个是最重要的。

那就是问题所在。BitConverter.ToUInt16将第一个字节视为最不重要的字节,因为这就是您的系统的工作方式。见BitConverter.IsLittleEndian

我试过反转数组,

那应该行得通。或者,手动组合这两个字节,而不使用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 回答