<p>你只需打开串行端口并启动线程。在</p>
<pre><code>import atexit
class SerialPort(QThread):
connectResult = QtCore.pyqtSignal(str)
position1 = QtCore.pyqtSignal(str)
actuPosResult = QtCore.pyqtSignal(str)
def __init__(self, port=None, baud=115200, timeout=1):
super().__init__()
self.ser = serial.Serial()
self.ser.port = port
self.ser.baudrate = baud
self.ser.timeout = timeout
self.running = False
atexit.register(self.ser.close) # Make sure the serial port closes when you quit the program.
def set_port(port_num):
self.ser.port = "COM"+str(port_num)
def start(self, *args, **kwargs):
self.running = True
self.ser.open()
super().start()
self.ser.write("c\n".encode("ascii"))
def run(self):
while self.running:
try:
incomingByte = self.ser.read()
decodedByte = incomingByte.decode("utf-8")
if decodedByte == ('c'):
r='Atmega On-Line'
self.connectResult.emit(r)
pos1=' -'
self.position1.emit(pos1)
else:
r=' No answer from Atmega.'
self.connectResult.emit(r)
except:
pass
# time.sleep(0.01) # You may want to sleep or use readline
</code></pre>
<p>通过让一个按钮调用start方法来使用这个类。在</p>
^{pr2}$
<p>通常只能打开一个串行端口一次,除非您知道您的两个端口都可用。在</p>
<p>串行端口存在于主线程上,并且一直存在。您不需要连续打开和关闭串行端口。所有的阅读都发生在线程中。要写只需调用<code>serial.write(b"c\n")</code>。你不应该让写作发生在线程中。在</p>
<p>要让用户选择com端口,只需使用QLineEdit。在</p>
<pre><code>myserial = QtGui.QLineEdit("3")
myserial.textChanged.connect(serial.set_port)
</code></pre>