4. AT指令通信建立:AT指令的发送方式、串口通信参数设置、AT指令的同步与异步模式

好,咱们正式开始聊AT指令的通信建立。

说实话,很多新手拿到NB-IoT模块,第一件事就是往串口里丢AT指令。结果呢?要么没反应,要么返回一堆乱码。我当年也踩过这个坑,折腾了一下午才发现是波特率没对上。所以这一节,咱们把通信建立这件事彻底讲透。

4.1 AT指令的发送方式

AT指令说白了就是一套文本命令。你发一串字符,模块回你一串字符。就这么简单。

但发送方式上,有几种常见的套路:

  • 手动发送:用串口助手,一条一条敲。调试阶段最常用。
  • 程序发送:MCU通过UART接口,按协议逐条发送。产品阶段必须用。
  • 批量发送:把多条指令拼在一起发,中间用换行隔开。有些模块支持,有些不支持。

我个人习惯,调试阶段先用串口助手摸清模块的脾气。等指令流程跑通了,再移植到MCU代码里。你想想看,如果直接在代码里调试,出了问题你都不知道是模块没响应,还是代码逻辑有bug。

小技巧: 发送AT指令时,每条指令末尾必须带回车换行(\r\n)。很多模块对格式非常敏感,少个回车它就不理你。我曾经遇到过客户说模块坏了,结果一看,他发的AT后面没加\r\n。

4.2 串口通信参数设置

串口参数设置是通信建立的第一步,也是最容易出问题的一步。

NB-IoT模块的串口参数,通常出厂默认是:

参数 默认值 说明
波特率 9600 或 115200 不同模块默认值不同,建议查手册确认
数据位 8 几乎都是8位,别乱改
停止位 1 1位停止位最常用
校验位 NB-IoT场景很少用校验位
流控制 RTS/CTS基本不用

嗯,这里要注意。波特率这个参数,不同模块的默认值可能不一样。比如移远的BC95默认是9600,而中移的M5310默认是115200。我建议你拿到模块后,先按9600试一下,没反应再换115200。

为什么会这样?因为有些模块出厂固件版本不同,波特率设置也会变。我有个项目,同一批模块,一半是9600,一半是115200,查了半天才发现是批次问题。

避坑指南: 我曾经在调试时,串口助手显示正常,但MCU就是收不到数据。最后发现是MCU的UART时钟配置错了,实际波特率偏离了目标值5%。模块对波特率误差容忍度一般在2%以内,超过这个范围就会丢数据。所以,用示波器量一下TX脚的波形,是最靠谱的验证方式。

4.3 AT指令的同步与异步模式

这个知识点,说白了就是「你发指令后,是等着模块回你,还是先去干别的事」。

同步模式:发一条指令,等模块返回结果,再发下一条。简单、可靠,但效率低。

异步模式:发完指令不等待,直接发下一条。模块返回的结果通过中断或回调处理。效率高,但代码复杂。

我个人的经验是:调试阶段用同步模式,产品阶段用异步模式。

举个例子,你要查询信号强度:

// 同步模式伪代码
send("AT+CSQ");
wait_for_response();  // 阻塞等待
parse_response();     // 解析结果

// 异步模式伪代码
send("AT+CSQ");
// 不等待,继续执行其他任务
// 当UART收到数据时,触发中断
// 在中断处理函数中解析结果

你想想看,如果产品里所有指令都用同步模式,那MCU大部分时间都在傻等。NB-IoT模块的响应时间有时能到几秒,这几秒MCU啥也干不了,太浪费了。

但异步模式也有坑。我记得有个项目,用了异步模式后,模块返回的数据老是解析错。查到最后发现是UART接收缓冲区太小,数据被截断了。所以用异步模式时,一定要把接收缓冲区设大一点,至少256字节起步。

核心要点:
  • 同步模式:简单可靠,适合调试和指令数量少的场景
  • 异步模式:高效灵活,适合产品化和多指令并发场景
  • 实际项目中,我通常把两种模式混用:关键指令(如入网)用同步,非关键指令(如查询状态)用异步

最后说一句,不管用哪种模式,一定要处理好超时机制。模块有时候会死掉,或者信号不好导致响应延迟。我一般设3秒超时,超时后重试3次,还不行就复位模块。这个策略在我做过的项目里,基本没出过问题。

经验之谈: 如果你发现模块偶尔不响应指令,别急着怀疑硬件。先检查一下串口线是不是松了,或者电源是不是有波动。我遇到过最离谱的一次,是USB转串口线质量太差,导致数据丢包。换了一根线,问题全解决了。