import serial
import serial.tools.list_ports
import threading
import time
def list_serial_ports():
"""列出所有可用的串口"""
ports = serial.tools.list_ports.comports()
available_ports = []
for port, desc, hwid in sorted(ports):
print(f"发现串口: {port} - {desc}")
available_ports.append(port)
return available_ports
def serial_receiver(ser):
"""串口数据接收线程"""
print("串口接收线程启动...")
while True:
if ser.in_waiting > 0:
data = ser.read(ser.in_waiting)
try:
print(f"接收到数据: {data.decode('utf-8')}")
except UnicodeDecodeError:
print(f"接收到二进制数据: {data}")
def serial_sender(ser):
"""串口数据发送函数"""
print("输入要发送的消息 (输入 'exit' 退出):")
while True:
message = input()
if message.lower() == 'exit':
break
try:
ser.write(message.encode('utf-8'))
print(f"已发送: {message}")
except serial.SerialException as e:
print(f"发送失败: {e}")
break
def main():
# 列出可用串口
ports = list_serial_ports()
if not ports:
print("没有找到可用的串口!")
return
# 选择串口
port_name = input("请输入要使用的串口名称 (如 COM1): ")
try:
# 配置串口参数
ser = serial.Serial(
port=port_name,
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1,
xonxoff=False,
rtscts=False,
dsrdtr=False
)
# 启动接收线程
receiver_thread = threading.Thread(target=serial_receiver, args=(ser,))
receiver_thread.daemon = True
receiver_thread.start()
# 主线程处理发送
serial_sender(ser)
except serial.SerialException as e:
print(f"串口错误: {e}")
finally:
if 'ser' in locals() and ser.is_open:
ser.close()
print("串口已关闭")
if __name__ == "__main__":
main()
1456

被折叠的 条评论
为什么被折叠?



