算法 – 将数据发送到串口的最佳方法是什么?

这与微控制器有关,但考虑将其发布在此处,因为它是算法和数据类型的问题,而不是任何硬件内容.我将解释这个问题,以便没有任何硬件知识的人仍然可以参加:)

  1. In Microcontroller there is an Analog to Digital converter with 10
    bit resolution. (It will output a
    value between 0 and 1023)

  2. I need to send this value to PC using the serial port.

  3. But you can only write 8 bits at once. (You need to write bytes). It is
    a limitation in micro controller.

  4. So in the above case at least I need to send 2 bytes.

  5. 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)"

总之,我需要以最快的方式在Serial上发送一个10位数的序列. 🙂

最佳答案
您需要发送10位,并且因为您一次发送一个字节,所以您必须发送16位.最大的问题是速度优先级是多少,发送方和接收方的同步程度如何?根据这些条件,我可以想到3个答案.

定期抽样,未知连接点

如果设备一直在运行,你不确定何时连接(你可以在序列中的任何时间加入)但是采样率比通信速度慢,所以你不关心大小我想我可能会这样做.假设你试图发送十位abcdefghij(每个字母一位).

我发送pq0abcde然后发送pq1fghij,其中p和q是error checking bits.这样:

>不需要分隔符(您可以通过0或1判断您正在读取哪个字节)
>你绝对可以发现任何1位错误,所以你知道坏数据

我很难找到一个好的两位纠错码,所以我想我只需要为2,3和4位(0,ab在上面)和qa奇偶校验位为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个字节那么没问题.如果你想要更多的空间节省,并且已经拥有良好的样本数据,我将使用huffman coding进行压缩.

密集数据,未知连接点

在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个连续的,以16个字节发送的120位):

>字节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

这是一个非常有趣的问题!

转载注明原文:算法 – 将数据发送到串口的最佳方法是什么? - 代码日志