You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

8端口256槽位SIM Bank串口与槽位映射实现方法咨询

实现8端口256槽位SIM Bank的串口编号与Bank端口映射

要解决COM口与SIM Bank端口的映射问题,核心逻辑是通过切换SIM Bank的目标端口,测试每个COM口是否能与该端口下的SIM卡建立通信——能正常响应AT命令的COM口,就对应当前切换的Bank端口。以下是具体实现方案及修正后的代码:

核心步骤

  1. 初始化SIM Bank的控制串口(即代码中real_port对应的COM口)。
  2. 遍历SIM Bank的8个端口(1-8),通过AT命令切换到每个端口的固定槽位(比如槽位1)。
  3. 对每个切换后的Bank端口,遍历所有待测试的COM口,发送AT命令验证通信连通性。
  4. 记录能正常响应的COM口与当前Bank端口的映射关系。

修正后的实现代码

import serial
import serial.tools.list_ports
import time

def execute_command(modem, command, wait_time=1):
    """发送AT命令并返回格式化后的响应"""
    try:
        modem.reset_input_buffer()  # 清空输入缓冲区,避免残留数据干扰判断
        modem.write(f"{command}\r".encode())
        time.sleep(wait_time)
        response = modem.readlines()
        return [line.decode('utf-8', errors='ignore').strip() for line in response]
    except serial.SerialException as e:
        print(f"串口 {modem.port} 执行命令 {command} 失败: {str(e)}")
        return []

def get_com_port_mapping(control_com, target_coms):
    """获取COM口与SIM Bank端口的映射关系"""
    port_mapping = {}
    # 初始化控制串口
    try:
        control_modem = serial.Serial(control_com, 115200, timeout=2)
    except serial.SerialException as e:
        print(f"控制串口 {control_com} 打开失败: {str(e)}")
        return port_mapping

    # 遍历SIM Bank的8个端口(1-8)
    for bank_port in range(1, 9):
        # 切换到当前Bank端口的槽位1
        switch_cmd = f"AT+SWIT{bank_port:02d}-0001"
        response = execute_command(control_modem, switch_cmd)
        if "SWITCH OK" not in ''.join(response):
            print(f"切换到Bank端口 {bank_port} 失败")
            continue

        # 遍历所有待测试的COM口,寻找能通信的端口
        for com_port in target_coms:
            try:
                test_modem = serial.Serial(com_port, 115200, timeout=2)
                # 用简单AT命令验证连通性(比AT+COPS=?响应更快)
                at_response = execute_command(test_modem, "AT")
                if "OK" in at_response:
                    port_mapping[bank_port] = com_port
                    print(f"Bank端口 {bank_port} 对应COM口: {com_port}")
                    test_modem.close()
                    break  # 找到对应端口后终止当前COM口遍历
                test_modem.close()
            except serial.SerialException as e:
                print(f"测试COM口 {com_port} 失败: {str(e)}")
                continue

    control_modem.close()
    return port_mapping

if __name__ == "__main__":
    # 替换为你的SIM Bank控制串口,比如"COM1"
    CONTROL_COM_PORT = "COM" + str(real_port)
    # 替换为你的8个待测试COM口列表,示例为COM132到COM139
    TARGET_COM_PORTS = [f"COM{i}" for i in range(132, 140)]

    mapping = get_com_port_mapping(CONTROL_COM_PORT, TARGET_COM_PORTS)
    print("\n最终映射关系:")
    for bank_port, com_port in mapping.items():
        print(f"Bank端口 {bank_port} -> {com_port}")

关键细节说明

  • AT命令优化:用AT命令替代AT+COPS=?,前者响应更快,能大幅提升测试效率;若需验证SIM卡状态,再替换为AT+COPS=?。
  • 缓冲区处理:每次发送命令前清空串口输入缓冲区,避免历史残留响应干扰判断结果。
  • 资源管理:每个测试串口使用后及时关闭,防止端口占用冲突。
  • 效率提升:找到对应COM口后立即跳出循环,减少不必要的测试操作。

内容的提问来源于stack exchange,提问作者Mahuhindura Balana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:44:56