双向通信脚本2

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值