调用一次AT+VTS后StarTech modem重复发三次DTMF9音,如何解决?
解决DTMF音被重复识别的方案
1. 调整调制解调器DTMF参数
部分调制解调器默认会对DTMF音做重复触发或增益处理,先排查并修改相关配置:
- 发送
AT+VSM=?查看语音模式下的DTMF输出配置,确认是否存在重复发送的默认设置 - 尝试使用
AT+DTMF=9,100替代AT+VTS命令(部分设备的AT+DTMF对时长控制更精准,100对应100ms时长) - 若坚持用
AT+VTS,尝试发送AT+VTS=9后立即发送AT+VTS=强制终止音输出,避免音长溢出:enviar(ser, 'AT+VTS=9') time.sleep(0.08) # 匹配80ms时长 enviar(ser, 'AT+VTS=')
2. 精准控制通话建立时机
代码中用固定5秒延迟判断通话建立,可能导致DTMF音在通话未完全稳定时发送,被门禁误识别:
- 监听调制解调器返回的
VOICE或CONNECT标识,确认通话完全建立后再发送DTMF,替换原有的延迟逻辑:# 替换原等待逻辑 if line: print(f"[MODEM] {line}") if any(tag in line for tag in ["RING", "R", "NMBR", "NAME", "DATE"]): last_call = time.time() waiting_for_tone = True # 新增通话建立判断 elif "VOICE" in line or "CONNECT" in line: print("[INFO] Call connected. Sending DTMF tone 9...") log_event("Call detected. Sending DTMF tone 9") enviar(ser, 'AT+VTS={9,7}') time.sleep(1) # 延长静音时间避免干扰 enviar(ser, "ATH") # 重置状态 last_call = None waiting_for_tone = False print("[INFO] Waiting for the next call...\n")
3. 优化音频输出与硬件环境
- 关闭调制解调器自动增益控制(AGC),发送
AT+VAG=0,0(参数需参考设备手册),防止音频被过度放大导致门禁重复识别 - 检查调制解调器与门禁的音频线路,使用屏蔽线减少干扰,确保线路连接牢固
4. 简化代码逻辑
每次通话后重置调制解调器可能导致状态不稳定,移除挂断后的initialize_modem(ser)调用,仅在程序启动时初始化一次即可。
快速验证方法
先用串口工具(如minicom)手动执行AT命令测试:
- 发送
ATZ→ATE0→AT+FCLASS=8→ATS0=1完成初始化 - 等待来电接通后,手动发送
AT+VTS={9,7} - 若手动测试仍出现重复识别,说明是调制解调器或门禁的硬件/配置问题;若手动正常,则排查
enviar函数是否存在重复发送的逻辑
内容的提问来源于stack exchange,提问作者Colunga_333
相关产品推荐
相关产品推荐

