我正在尝试为我的arduino编写曼彻斯特编码。
这意味着 1 位由 10 表示,零由 01 表示。
1111 在曼彻斯特代码中是 10101010。
我的程序(Arduino 上的 C++)将字符数组编码为曼彻斯特代码,如下所示:
//Output needs to be twice as big as input
void encodeManchester(char * input, char * output, int size) {
for(int i=0; i<size; i++) {
for(int p=0; p<2; p++) {
int pos = i*2+(p);
output[pos] = 0b00000000;
for (int j=0; j<4; j++) {
int actval = input[i]>>(7-(j+4*p));
if((actval & 0b00000001) == 0b00000001) {
output[pos] = output[pos] | (0b10<<(j*2));
} else {
output[pos] = output[pos] | (0b01<<(j*2));
}
}
}
}
}
我的解码器(PC 上的 Python)看起来像:
def manDecode(data):
ret = []
for i in range(0, len(data)/2):
ret.append(0b00000000);
for p in range(0, 2):
print(bin(data[i*2+p]));
for j in range(0, 4):
part = (data[i*2+p] >> (6-(j*2))) & 0b11
if part == 0b10:
ret[i] = ret[i] | (0b10000000 >> (j+p*4))
return ret;
但是我在曼彻斯特代码中得到了奇怪的值,例如:0b11110000 或 0b1111111。它们从哪里来?
最佳答案
在 C++ 和 python 之间的代码索引中存在一些不匹配问题。
首先,在使用位操作时,使用 unsigned types
会更好。 (在这种情况下将是 unsigned char),因为当 C++ 需要转换为更大的类型时,您可以避免由符号扩展引起的很多问题。
C++ 版本中我所做的唯一更改是将输入类型更改为 unsigned char
void encodeManchester(unsigned char* input, unsigned char* output, int size)
Python版本是:
def manDecode(data):
ret = []
for i in range(0, len(data)/2):
ret.append(0b00000000);
for p in range(0, 2):
print(bin(data[i*2+p]));
for j in range(0, 4):
part = (data[i*2+p] >> (6-(j*2))) & 0b11
if part == 0b10:
ret[i] = ret[i] | (1 << (j+(1-p)*4))
return ret;
更改在行中:ret[i] = ret[i] | (1 << (j+(1-p)*4))
检查 (1-p) 而不是 p 这是必需的,因为您首先要形成数字 high nible
然后low nible
在与先前版本的第一次迭代中将是 ret[i] | (1 << (0 + 0 * 4))
不改变任何东西(改变 low nible
)
关于python - 在 Arduino 上实现曼彻斯特编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936002/