如何在TeraTerm中通过AT命令读取Mbed Nucleo+JSN270的Buffer?
解决Nucleo上JSN270的AT命令Buffer读取问题
我仔细看了你的代码和场景描述,发现几个关键问题导致你读取不到正确的AT命令响应内容,咱们一步步来修正:
1. 先搞懂ATCmdParser的响应处理逻辑
你当前代码里at.send("at+ver") && at.recv("OK")只是验证命令是否执行成功(收到OK回执),但AT+VER返回的版本信息其实是在OK之前输出的,这部分内容并没有被捕获。直接调用at.read()大概率读到的是空字符或者内存垃圾值,因为ATCmdParser已经把响应内容处理过了。
2. 正确捕获AT命令的响应内容
ATCmdParser提供了带格式化匹配的recv方法,可以直接读取命令返回的有效内容,不用手动调用read。下面是修正后的完整代码:
#include "mbed.h" Serial pc(SERIAL_TX, SERIAL_RX); UARTSerial serial(D1, D0, 9600); ATCmdParser at(&serial, "\r\n"); int main() { char buffer[100] = {0}; // 初始化buffer,避免输出未初始化的垃圾值 pc.printf("发送AT+VER命令获取版本...\r\n"); // 发送命令 → 读取版本内容 → 确认收到OK回执 if (at.send("AT+VER") && at.recv("%s", buffer) && at.recv("OK")) { pc.printf("JSN270版本信息: %s\r\n", buffer); } else { pc.printf("获取版本失败或无响应\r\n"); // 调试用:读取串口剩余内容排查问题 int bytes_read = serial.read(buffer, sizeof(buffer)-1); if (bytes_read > 0) { buffer[bytes_read] = '\0'; pc.printf("收到异常内容: %s\r\n", buffer); } } while(1) { ThisThread::sleep_for(1s); // 保持程序运行 } }
3. 几个必须检查的细节
- 串口引脚交叉确认:Nucleo的D1(TX)要接JSN270的RX,D0(RX)接JSN270的TX,别搞反了,这是新手最容易踩的坑。
- 波特率匹配:确认JSN270的默认波特率是9600吗?有些模块出厂默认是115200,你可以先用TeraTerm直接连接模块发送
AT+VER确认。 - AT命令大小写:部分模块对AT命令大小写敏感,尽量用标准大写格式
AT+VER,别用小写at+ver。
4. 调试排查技巧
如果还是读不到内容,先跳过ATCmdParser,用原生串口手动收发确认通信链路没问题:
#include "mbed.h" Serial pc(SERIAL_TX, SERIAL_RX); UARTSerial serial(D1, D0, 9600); int main() { char buffer[100]; pc.printf("手动发送AT+VER\r\n"); serial.write("AT+VER\r\n", 7); ThisThread::sleep_for(500ms); // 给模块足够的响应时间 int len = serial.read(buffer, sizeof(buffer)-1); if (len > 0) { buffer[len] = '\0'; pc.printf("收到原始响应: %s\r\n", buffer); } else { pc.printf("未收到任何数据\r\n"); } while(1) {} }
如果这段代码能读到响应,说明链路没问题,再回到ATCmdParser的用法调整;如果读不到,就检查接线、波特率这些硬件层面的问题。
内容的提问来源于stack exchange,提问作者윤성권
相关产品推荐
相关产品推荐

