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

调用一次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命令测试:

  1. 发送ATZ→ATE0→AT+FCLASS=8→ATS0=1完成初始化
  2. 等待来电接通后,手动发送AT+VTS={9,7}
  3. 若手动测试仍出现重复识别,说明是调制解调器或门禁的硬件/配置问题;若手动正常,则排查enviar函数是否存在重复发送的逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:43:14