<h2>串行波特率</h2>
<p>你在评论中提到了4800的波特率。对于串行端口,这是非常低的。串行端口使用两级(二进制)信令,因此以比特/秒为单位的数据速率等于以波特为单位的符号速率。在</p>
<p>但是我在一份数据表中看到了一个收发器,其中5kbits/s是典型的传输速率,9.6kbit/s是最大速率。也许你可以试着改进天线来提高传输速率?在</p>
<p>但是4800波特串行意味着你不会得到超过4800/8=600字节/秒的带宽(这是忽略停止位和奇偶校验位之类的东西)。对于一个10字节的消息,你应该得到最多60Hz。一条5字节的信息可以将其提高到120赫兹。看来发射机是限制因素。在</p>
<p>这意味着你必须节约每一点!在</p>
<h2>打包数据</h2>
<p>代码以连接的十进制字符串的形式传输数据。对于5个数字,这需要10个字节。可以将其一分为二:</p>
<p>让我们生成5个0-100范围内的2位数字。在</p>
<pre><code>In [1]: import random
In [2]: data = [random.randint(0, 101) for _ in range(5)]
In [3]: data
Out[3]: [18, 80, 55, 96, 44]
</code></pre>
<p>两位数的十进制数只需要一个字节就可以存储它们。即使是两位数的十六进制数也能容纳一个字节。让我们把这些数字合并成一个字节串。在</p>
^{pr2}$
<p>您可以在一个串行的<code>write</code>调用中发送这个5字节的字符串,并在接收端解包它们。在</p>
<p>让我们比较一下这两种情况下的速度。我已经将您的原始代码和我的<code>struct</code>解决方案包装在函数中,因此我可以轻松地使用IPython的<code>%timeit</code>魔术命令来测量它们。在</p>
<pre><code>In [7]: %cpaste
Pasting code; enter ' ' alone on the line to stop or use Ctrl-D.
:def astext():
: data = [random.randint(0, 101) for _ in range(5)]
: sPortMotorSignal = '{:02d}'.format(data[0])
: sStrbMotorSignal = '{:02d}'.format(data[1])
: sTailMotorSignal = '{:02d}'.format(data[2])
: sPortAngleSignal = '{:02d}'.format(data[3])
: sStrbAngleSignal = '{:02d}'.format(data[4])
: sSignal = (sPortMotorSignal + sStrbMotorSignal + sTailMotorSignal +
: sPortAngleSignal + sStrbAngleSignal)
: return sSignal
:
:
:def asbinary():
: data = [random.randint(0, 101) for _ in range(5)]
: return struct.pack('5B', *data)
:
In [8]: %timeit astext()
10000 loops, best of 3: 31.6 µs per loop
In [9]: %timeit asbinary()
10000 loops, best of 3: 23.5 µs per loop
In [10]: (31.6-23.5)/31.6
Out[10]: 0.2563
</code></pre>
<p>(在intel core2处理器上。<code>Pi</code>中的ARM芯片可能会慢一些。)生成二进制字符串所需的时间大约比生成文本字符串少25%。在</p>
<p>但从这些时候你可以看出,它们对性能并不重要。它们可以以大于30 kHz的频率收集数据。<code>Pi</code>必须慢150倍才能达到时间关键。在</p>
<p>重要的是二进制字符串只有文本字符串的一半长,所以我希望它的传输速度大约是文本字符串的两倍。在</p>
<p>你应该仔细考虑的是每个信号实际上需要多少个不同的信号电平?四位给你2⁴=16个级别,而8位给你2⁸=256个级别。如果您的应用程序可以使用16个信号电平,那么您可以将消息打包为5*4=20位。在</p>