在Arduino上实现曼彻斯特编码
Implement Manchester Encoding on Arduino
我正在尝试为我的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
)
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用已使用 java 编码的 openssl 解码数据
- boost 是否有按特殊类型值编码状态"compact optional"?
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 绝对编码器十六进制输入
- 防止C++中的硬编码数字
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 使用文件内容作为硬编码字符串
- 运行长度编码程序 c++ 的问题
- 以C++为单位进行运行长度编码
- *新的编码器*格式和运算符
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- C++和带有国家符号的文件路径(也许用 UTF8 编码)
- 在Arduino上实现曼彻斯特编码