您需要发送 10 位,并且因为您一次发送一个字节,所以您必须发送 16 位。最大的问题是速度有多重要,发送者和接收者的同步程度如何?根据这些条件,我可以想到 3 个答案。
常规采样,未知连接点
如果设备一直在运行,您不确定何时连接(您可以在序列中的任何时间加入)但采样率低于通信速度,因此您不必关心大小我想我'可能会这样做如下。假设您尝试发送十位abcdefghij
(每个字母一位)。
pq0abcde
然后我会发送错误检查位pq1fghij
的位置p
和q
位置。这边走:
- 不需要分隔符(您可以通过 0 或 1 来判断您正在读取哪个字节)
- 您绝对可以发现任何 1 位错误,因此您了解不良数据
我正在努力寻找一个好的两位纠错码,所以我想我只是为位 2,3 和 4(0,上面的 ab)制作 pa 奇偶校验位,为 5 6 和 7(c, d、e 以上)。举个例子可能会更清楚。
- 假设我要发送 714 = 1011001010。
- 拆分为 2 10110 , 01010
- 添加位以指示第一个和第二个字节 010110、101010
- 计算每一半的奇偶校验:p0=par(010)=1, q0=par(110)=0, p1=par(101)=0, q1=par(010)=1
- 字节然后是 10010110, 01101010
然后,您可以检测到许多不同的错误情况,如果您失去同步,可以快速检查您正在发送的字节,并且在微控制器中没有任何操作需要很长时间(我会使用 8 条目查找表进行奇偶校验)。
密集数据,已知连接点
如果您知道读取器与写入器同时启动,只需将 4 个十位值作为 5 个字节发送即可。如果您总是一次读取 5 个字节,那么没有问题。如果您想节省更多空间,并且已经拥有良好的样本数据,我会使用哈夫曼编码进行压缩。
密集数据,未知连接点
在 7 个字节中,您可以发送 5 个 10 位值和 6 个备用位。像这样发送 5 个值:
- 字节 0:0(7 位)
- 字节 1:1(7 位)
- 字节 2:1(7 位)
- 字节 3:1(7 位)
- 字节 4:0(7 位)
- 字节 5:0(7 位)
- 字节 6:(8 位)
然后,每当您看到最高有效位连续出现 3 个 1 时,您就知道您有字节 1、2 和 3。这个想法在 56 中浪费了 1 个位,因此可以提高效率,但您必须发送更多一次的数据。例如(5 个连续的,120 位以 16 个字节发送):
- 字节 0:0(7 位)7
- 字节 1:1(7 位)14
- 字节 2:1(7 位)21
- 字节 3:1(7 位)28
- 字节 4:1(7 位)35
- 字节 5:1(7 位)42
- 字节 6:0(7 位)49
- 字节 7:(8 位)57
- 字节 8:(8 位)65
- 字节 9:(8 位)73
- 字节 10:(8 位)81
- 字节 11:0(7 位)88
- 字节 12:(8 位)96
- 字节 13:(8 位)104
- 字节 14:(8 位)112
- 字节 15:(8 位)120
这是一个非常有趣的问题!