串行读取、整理、写入 AT 命令

Posted

技术标签:

【中文标题】串行读取、整理、写入 AT 命令【英文标题】:Serial read, collate, write AT commands 【发布时间】:2022-01-21 18:08:37 【问题描述】:

这很可能是一个软件问题,不知道在哪里发布(Arduino 潜艇?电子潜艇?)。

我有一个 Arduino Mega,它连接到:

通过 SPI 读取的 RFID 卡, 通过 Serial1 的 wifi 芯片 (esp8266-12f)。

wifi 芯片目前充当网络服务器,因为我打算通过互联网向它发送命令。我还希望那个wifi芯片充当客户端,也就是说:当RFID读取卡时,我希望Arduino Mega通过Serial1将RFID的卡id转发给wifi芯片,以便wifi芯片可以发送一个http请求将其保存到 sql 数据库中的专用服务器。

到目前为止,这就是我在 wifi 芯片上的编码方式:

// esp as a Server
// [...]

// esp as a Client
timeout = millis() + (10 * 1000UL); // 10s
String input;

while (Serial.available() >= 0 && millis() < timeout) 
  input += Serial.readStringUntil('\r');
  int pos = input.indexOf("AT+TEST");

  if (pos >= 0) 
    Serial.println(F("AT+TEST"));
    // collate, aka confirm to Arduino Mega we understood the command and we are processing it
    // todo: process the command, aka parse the command, send an http request, etc
    Serial.println(F("\r\nOK"));
   else 
    Serial.println(F("\r\nNOPE"));
  

正如您可能已经猜到的那样,芯片一遍又一遍地打印“AT+TEST”(直到它超时,然后循环无限 NOPE),因为它试图一遍又一遍地处理命令,但我只是想要它说“好的 Arduino Mega,我知道你希望我执行 AT+TEST”

有什么优雅的方法可以让 wifi 芯片“忽略”它自己打印到自己的序列号的东西?它应该只执行来自 Arduino Mega 的命令。

这是出厂默认固件做得很好的事情:当我发送“AT”时,它只回显一次“AT\r\n\r\nOK”。 我发现了这个,但我不明白他们是如何实现这个想法的(到处都是不相关的代码):https://github.com/JiriBilek/ESP_ATMod/blob/d6ad63f71ef3189518ef4740f16a9d697c3e843a/ESP_ATMod/ESP_ATMod.ino#L581

正在寻找实现这一目标的可靠方法的指导,因为有大量数据进出该系列的 wifi 芯片。

【问题讨论】:

esp8266 或任何其他 MCU 不会读取它在串行上发送的内容。发送和接收是完全独立的。我不明白你的问题。 【参考方案1】:

由于换行,它循环了。不仅如此,它还需要一个 1ms 的延迟。 抱歉对我的问题的解释不佳。

以下工作符合我的预期:

  // esp as a client
  String input;
  timeout = millis() + (5 * 1000UL); // 5s
  while (Serial.available() && millis() < timeout) 
    input = Serial.readStringUntil('\r'); // up to CR
    delay(1); Serial.read(); // discard LF

    // collate
    Serial.println(input);

    // AT+TEST
    if (input.indexOf("AT+TEST") >= 0) 
      Serial.println(F("\r\nOK"));
      // todo : verbose for debug
     
    // AT+GET=https://arduino.example.tld/api/arduino.php?token=123&key1=val1
    else if (input.indexOf("AT+GET") >= 0) 
      Serial.println(F("\r\nOK"));
      // todo : regex + http get req
     else 
      Serial.println(F("\r\nERROR"));
    
  

【讨论】:

以上是关于串行读取、整理、写入 AT 命令的主要内容,如果未能解决你的问题,请参考以下文章

微控制器的环形缓冲区

串行通信写入

时序问题:QT 写入串行端口,然后读取

Proteus仿真在AT24C04的连续地址中写入数据并循环读取

at指令

使用串行端口,我收到一个错误:尝试读取或写入受保护的内存