在Arduino上实现曼彻斯特编码

Implement Manchester Encoding on Arduino

本文关键字:曼彻斯特 编码 实现 Arduino      更新时间:2023-10-16

我正在尝试为我的arduino编程曼彻斯特编码。

这意味着1位由10表示,0由01表示。

1111在马纳切斯特码中为10101010。

我的程序(Arduino上的C++)将char数组编码为曼彻斯特代码,看起来像:

//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(在这种情况下是无符号字符),因为当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