这与微 Controller 有关,但我想把它贴在这里,因为它是算法和数据类型的问题,而不是任何硬件的问题。我会解释这个问题,这样没有任何硬件知识的人仍然可以参与:)
In Microcontroller there is an Analog to Digital converter with 10 bit resolution. (It will output a value between 0 and 1023)
I need to send this value to PC using the serial port.
But you can only write 8 bits at once. (You need to write bytes). It is a limitation in micro controller.
So in the above case at least I need to send 2 bytes.
My PC application just reads a sequence of numbers for plotting. So it should capture two consecutive bytes and build the number back. But here we will need a delimiter character as well. but still the delimiter character has an ascii value between 0 - 255 then it will mixup the process.
那么最简单的方法是什么?我应该将值作为字符序列发送吗?
Ex : 1023 = "1""0""2""3" Vs "Char(255)Char(4)"
总而言之,我需要以最快的方式通过串行发送一个 10 位数的序列。 :)
最佳答案
您需要发送 10 位,因为一次发送一个字节,所以您必须发送 16 位。最大的问题是速度的优先级是多少,发送方和接收方的同步程度如何?根据这些条件,我可以想到 3 个答案。
常规采样,未知连接点
如果设备一直在运行,你不确定什么时候连接(你可以在序列中的任何时间加入)但是采样率比通信速度慢所以你不关心大小我想我可能会这样做如下。假设您正在尝试发送十位 abcdefghij
(每个字母一位)。
我会发送 pq0abcde
,然后发送 pq1fghij
,其中 p
和 q
是 error checking bits .这样:
- 不需要分隔符(您可以通过 0 或 1 来判断您正在读取的是哪个字节)
- 您绝对可以发现任何 1 位错误,因此您知道坏数据
我正在努力寻找一个好的两位纠错码,所以我想我只是让 p 成为位 2,3 和 4 的奇偶校验位(0,上面的 a b)和 q 是 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
然后你可以检测到很多不同的错误情况,如果你失去了同步,可以快速检查你发送的是哪个字节,并且在微 Controller 中没有一个操作需要很长时间(我会用 8 条目查找来进行奇偶校验表)。
密集数据,已知连接点
如果您知道读取器与写入器同时启动,只需将 4 个十位值作为 5 个字节发送。如果您总是一次读取 5 个字节,那么没有问题。如果你想节省更多空间,并且已经有了好的样本数据,我会使用 huffman coding 进行压缩。 .
密集数据,未知连接点
在 7 个字节中,您可以发送 5 个十位值和 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个,16个字节发送120位):
- 字节0:0(7位)7
- 字节1:1(7位)14
- 字节2:1(7位)21
- 字节 3:1(7 位)28
- byte 4: 1 (7 bits) 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
这是一个非常有趣的问题!
关于algorithm - 将数据发送到串口的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3966301/