<p>使用单独的线程是完全不必要的。只需在无限while循环中执行此操作(在Python 3.2.3中进行了测试):</p>
<pre><code>import serial
import time # Optional (if using time.sleep() below)
while (True):
# NB: for PySerial v3.0 or later, use property `in_waiting` instead of function `inWaiting()` below!
if (ser.inWaiting()>0): #if incoming bytes are waiting to be read from the serial input buffer
data_str = ser.read(ser.inWaiting()).decode('ascii') #read the bytes and convert from binary array to ASCII
print(data_str, end='') #print the incoming string without putting a new-line ('\n') automatically after every print()
#Put the rest of your code you want here
time.sleep(0.01) # Optional: sleep 10 ms (0.01 sec) once per loop to let other threads on your PC run during this time.
</code></pre>
<p>这样你只有在有东西的时候才能阅读和打印。你说,“理想情况下,我应该能够读取串行数据只有当它可用。”这正是上面的代码所做的。如果没有可供读取的内容,它将跳到while循环中的其余代码。完全没有阻塞。</p>
<p>(此答案最初发布在此处调试:<a href="https://stackoverflow.com/questions/38757906/python-3-non-blocking-read-with-pyserial-cannot-get-pyserials-in-waiting-pro/">Python 3 non-blocking read with pySerial (Cannot get pySerial's "in_waiting" property to work)</a>)</p>
<p>pySerial文档:<a href="http://pyserial.readthedocs.io/en/latest/pyserial_api.html" rel="noreferrer">http://pyserial.readthedocs.io/en/latest/pyserial_api.html</a></p>
<p>更新:</p>
<ul>
<li>2018年12月27日:增加了关于<code>in_waiting</code>与<code>inWaiting()</code>的评论。感谢@FurkanTürkal在下面的评论中指出这一点。请参阅此处的文档:<a href="https://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.in_waiting" rel="noreferrer">https://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.in_waiting</a>。</li>
<li>2018年10月27日:添加sleep以让其他线程运行。
<ul>
<li>文档:<a href="https://docs.python.org/3/library/time.html#time.sleep" rel="noreferrer">https://docs.python.org/3/library/time.html#time.sleep</a></li>
<li>感谢@RufusV2在评论中提出了这一点。</li>
</ul></li>
</ul>
<h2>多线程注意事项:</h2>
<p>尽管如上所示,读取串行数据不需要使用多个线程,但以非阻塞方式读取键盘输入也不需要。因此,为了实现无阻塞的键盘输入读取,我编写了这个答案:<a href="https://stackoverflow.com/questions/5404068/how-to-read-keyboard-input/53344690#53344690">How to read keyboard-input?</a>。</p>