0%

Motorola解析赋值

Motorola数据解析及赋值

Motorola格式转换

字节顺序: Byte0, Byte1, … Byte7
bit位顺序: bit7, bit6, … bit0

Motorola LSB

`LSB`

Motorola MSB

`MSB`

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ulong Motorola_Get(byte[] data, int startbit, int bitlength, bool msb = true)
{
//处理格式转换
ulong longData = 0;
data.ToList().ForEach(b => longData = (longData << 8) + b);
//计算移位
int move = move ? data.Length * 8 - (8 - startbit % 8 - 1 + (startbit / 8) * 8) - bitlength : (data.Length - 1 - (startbit / 8)) * 8 + startbit % 8;
//计算屏蔽码
ulong mask = (ulong)Math.Pow(2, bitlength) - 1;
//
longData >>= move;
longData &= mask;
//
return longData;
}

void Motorola_Set(byte[] data, double values, int startbit, int bitlength, double factor, double offset, bool msb = true)
{
//处理格式转换
ulong dataSet = Convert.ToUInt64((values - offset) / factor);
ulong longData = 0;
data.ToList().ForEach(b => longData = (longData << 8) + b);
//计算移位
int move = move ? data.Length * 8 - (8 - startbit % 8 - 1 + (startbit / 8) * 8) - bitlength : (data.Length - 1 - (startbit / 8)) * 8 + startbit % 8;
//计算屏蔽码
ulong mask = (ulong)Math.Pow(2, bitlength) - 1;
longData = longData & ~(mask << move) | ((dataSet & mask) << move);
for (int i = 0; i < data.Length; i++)
{
data[7 - i] = (byte)(longData >> i * 8);
}
}