import serial
import time

def get_current_microsecond_timestamp():
    """
    获取当前时间的微秒级时间戳（基于高精度性能计数器）
    :return: 微秒级时间戳（整数）
    """
    return int(time.perf_counter() * 1000000)

def serial_send_with_custom_count(send_count, com_port="COM3", baud_rate=115200):
    """
    自定义次数的串口发送（带微秒级计时，超过1000微秒单独打印）
    :param send_count: 发送次数（正整数）
    :param com_port: 串口号（Windows=COMx，Linux=/dev/ttyUSBx）
    :param baud_rate: 波特率
    """
    # 1. 校验发送次数合法性
    if not isinstance(send_count, int) or send_count <= 0:
        print("错误：发送次数必须为正整数！")
        return

    # 2. 待发送的指定数据
    send_data = bytes([0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x71, 0xCB])
    print(f"待发送数据：{[hex(b) for b in send_data]}")
    print(f"单条数据长度：{len(send_data)} 字节")
    print(f"计划发送次数：{send_count} 次")
    print("-" * 50)

    # 3. 初始化串口
    ser = None
    try:
        # 串口配置
        ser = serial.Serial(
            port=com_port,
            baudrate=baud_rate,
            parity=serial.PARITY_NONE,
            bytesize=serial.EIGHTBITS,
            stopbits=serial.STOPBITS_ONE,
            write_timeout=1,
            timeout=1
        )

        if not ser.is_open:
            ser.open()
        print("串口已成功打开")
        print("-" * 50)

        # 记录总耗时（用于计算平均耗时）
        total_elapsed_microseconds = 0.0
        # 4. 循环发送（按自定义次数执行）
        for i in range(1, send_count + 1):
            # 单次发送：微秒级计时
            send_timestamp = get_current_microsecond_timestamp()
            start_time = time.perf_counter()

            # 同步发送+强制刷写缓冲区（确保数据实际发送）
            ser.write(send_data)
            ser.flush()

            # 计算单次耗时
            end_time = time.perf_counter()
            single_elapsed_seconds = end_time - start_time
            single_elapsed_microseconds = single_elapsed_seconds * 1000000

            # 累加总耗时
            total_elapsed_microseconds += single_elapsed_microseconds

            # 输出单次发送信息
            print(f"第 {i:3d} 次发送")
            print(f"  发送时间戳（微秒）：{send_timestamp}")
            print(f"  单次发送耗时：{single_elapsed_microseconds:.2f} 微秒")
            
            # 核心修改：判断耗时是否超过1000微秒，若是则单独打印
            if single_elapsed_microseconds > 1000:
                print(f"  ⚠️  警告：本次发送耗时超过1000微秒！实际耗时：{single_elapsed_microseconds:.2f} 微秒")
                 
            
            print("-" * 50)

        # 5. 输出汇总统计
        average_elapsed_microseconds = total_elapsed_microseconds / send_count
        print(f"发送完成！共发送 {send_count} 次")
        print(f"总耗时：{total_elapsed_microseconds:.2f} 微秒")
        print(f"平均单次耗时：{average_elapsed_microseconds:.2f} 微秒")

    except Exception as e:
        print(f"串口操作异常：{str(e)}")
    finally:
        # 释放串口资源
        if ser and ser.is_open:
            ser.close()
            print("串口已关闭")

if __name__ == "__main__":
    # 方式1：直接在代码中指定发送次数（例如：发送10次）
    # target_send_count = 10

    # 方式2：运行时手动输入发送次数（更灵活）
    try:
        target_send_count = int(input("请输入串口发送次数（正整数）："))
    except ValueError:
        print("输入无效，默认发送5次")
        target_send_count = 5

    # 调用发送函数（可修改串口号和波特率）
    serial_send_with_custom_count(
        send_count=target_send_count,
        com_port="COM8",  # Windows串口号，Linux改为"/dev/ttyUSB0"
        baud_rate=460800
    )

    input("按回车键退出...")