2. AT指令基础通信

任务说明

本案例要求通过串口向LTE Cat1/Cat4模块发送标准AT指令,并正确解析模块返回的响应与最终结果码,以此验证模块串口通信链路正常。需要完成的任务闭环为:编写一个可独立运行的串口AT指令交互程序,发送AT与AT+CGMM两条指令,分别验证模块基本响应能力与型号查询功能,并依据返回码判定通信是否成功。

实现方案

采用Python的pyserial库实现串口通信。程序流程为:打开指定串口→发送AT指令→读取并解析响应→根据结果码输出判定结论。AT指令以\r\n结尾,模块返回的最终结果码为OK或ERROR,中间可能包含若干信息行。解析逻辑以空行或结果码为边界提取完整响应。

import serial
import time

def send_at_command(ser, command, timeout=3):
    """发送AT指令并读取完整响应"""
    ser.reset_input_buffer()
    ser.write((command + '\r\n').encode('ascii'))
    time.sleep(0.1)
    
    response = b''
    start_time = time.time()
    while time.time() - start_time < timeout:
        if ser.in_waiting > 0:
            response += ser.read(ser.in_waiting)
            # 检测到最终结果码则停止读取
            if b'OK\r\n' in response or b'ERROR\r\n' in response:
                break
        else:
            time.sleep(0.05)
    
    return response.decode('ascii', errors='replace')

def parse_at_response(response):
    """解析AT指令响应,返回(信息行列表, 结果码)"""
    lines = response.strip().split('\r\n')
    info_lines = []
    result_code = None
    
    for line in lines:
        line = line.strip()
        if not line:
            continue
        if line in ('OK', 'ERROR'):
            result_code = line
        else:
            info_lines.append(line)
    
    return info_lines, result_code

def main():
    # 串口配置 - 根据实际模块连接修改
    PORT = 'COM3'      # Windows示例;Linux下如'/dev/ttyUSB0'
    BAUD = 115200      # 常用AT指令波特率
    
    try:
        ser = serial.Serial(PORT, BAUD, timeout=1)
        print(f'已打开串口 {PORT} @ {BAUD}')
    except serial.SerialException as e:
        print(f'串口打开失败: {e}')
        return
    
    # 测试1: 基础AT指令
    print('\n--- 测试1: 发送 AT ---')
    resp1 = send_at_command(ser, 'AT')
    info1, code1 = parse_at_response(resp1)
    print(f'原始响应: {repr(resp1)}')
    print(f'信息行: {info1}')
    print(f'结果码: {code1}')
    
    # 测试2: 查询模块型号
    print('\n--- 测试2: 发送 AT+CGMM ---')
    resp2 = send_at_command(ser, 'AT+CGMM')
    info2, code2 = parse_at_response(resp2)
    print(f'原始响应: {repr(resp2)}')
    print(f'信息行: {info2}')
    print(f'结果码: {code2}')
    
    # 判定结果
    if code1 == 'OK' and code2 == 'OK':
        print('\n[判定] 两条指令均返回OK,模块通信正常。')
        if info2:
            print(f'[型号] 模块型号: {info2[0]}')
    else:
        print('\n[判定] 存在非OK返回,请检查接线、串口号或模块供电。')
    
    ser.close()
    print('串口已关闭')

if __name__ == '__main__':
    main()

运行与验证

依赖安装:执行pip install pyserial安装串口库。

参数修改:根据实际模块连接的串口号修改PORT变量(Windows为COM口,Linux为/dev/ttyUSB*或/dev/ttyS*),波特率通常为115200或9600,需与模块当前配置一致。

执行方式:在终端运行python at_basic.py,观察输出。

判定标准:若两条指令的解析结果码均为OK,且AT+CGMM返回一行非空信息行(模块型号字符串),则判定模块通信正常,案例通过。若出现ERROR或超时无响应,需检查串口连接、模块供电及AT波特率是否匹配。

AT指令串口通信验证流程 主机/PC 串口调试程序 LTE Cat1/Cat4 通信模块 UART串口 (TX/RX/GND) ① 发送: AT\r\n ② 返回: \r\nOK\r\n ③ 发送: AT+CGMM\r\n ④ 返回: 模块型号\r\nOK\r\n 解析逻辑: 按\r\n分割 → 提取信息行 → 识别最终结果码 判定: 结果码为OK且型号行非空 → 通信正常

AT指令格式说明

AT指令以字符AT开头(可大写或小写),以回车换行(\r\n)结束。模块响应由信息行和最终结果码组成,结果码OK表示指令执行成功,ERROR表示失败。本案例中AT指令用于测试串口链路是否畅通,AT+CGMM用于查询模块型号标识。若模块返回ERROR,常见原因包括:指令格式错误、模块未注册网络(部分查询指令需要网络就绪)、或当前AT命令集不支持该指令。