8端口256槽位SIM Bank串口与槽位映射实现方法咨询
实现8端口256槽位SIM Bank的串口编号与Bank端口映射
要解决COM口与SIM Bank端口的映射问题,核心逻辑是通过切换SIM Bank的目标端口,测试每个COM口是否能与该端口下的SIM卡建立通信——能正常响应AT命令的COM口,就对应当前切换的Bank端口。以下是具体实现方案及修正后的代码:
核心步骤
- 初始化SIM Bank的控制串口(即代码中
real_port对应的COM口)。 - 遍历SIM Bank的8个端口(1-8),通过AT命令切换到每个端口的固定槽位(比如槽位1)。
- 对每个切换后的Bank端口,遍历所有待测试的COM口,发送AT命令验证通信连通性。
- 记录能正常响应的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
相关产品推荐
相关产品推荐

