我的 sim800l 仅在连接到打开串行监视器的笔记本电脑时工作

Posted

技术标签:

【中文标题】我的 sim800l 仅在连接到打开串行监视器的笔记本电脑时工作【英文标题】:My sim800l works only when connected to laptop with serial monitor open 【发布时间】:2019-04-13 18:43:15 【问题描述】:

我有这个代码,当它收到 SEND 这个词时,它会通过 SMS 发送 DHT11 值,但所有这些设置只有在我的 arduino nano 连接到笔记本电脑并且串行监视器打开时才有效,否则如果我连接到移动电源或墙壁充电器它不会向我发送值。即使它连接到笔记本电脑,如果我不打开串行监视器,它也不会发送。

这是代码

#include<SoftwareSerial.h>
#include "DHT.h"


#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

SoftwareSerial mySerial(10, 11);

int index = 0;
float h;
float temp;


char incomingByte;
String incomingData;
bool atCommand = true;
String message = "";
String number = "";

void setup()

  Serial.begin(9600);
  mySerial.begin(9600);
  dht.begin();

  while (!mySerial.available()) 
    mySerial.println("AT");
    delay(1000);
    Serial.println("connecting....");
  

  mySerial.println("AT+CMGF=1");  //Set SMS Text Mode
  delay(1000);
  mySerial.println("AT+CNMI=1,2,0,0,0");  //procedure, how to receive messages from the network
  delay(1000);
  //mySerial.println("AT+CMGL=\"REC UNREAD\""); // Read unread messages
  mySerial.println("AT+CBAND=DCS_MODE"); 
  Serial.println("Ready to receive Commands..");


void loop()



  if (mySerial.available()) 
    delay(100);
    // Serial buffer
    while (mySerial.available()) 
      incomingByte = mySerial.read();
      incomingData += incomingByte;
    
    delay(10);
    if (atCommand == false) 
      receivedMessage(incomingData);

    
    else 
      atCommand = false;
    
    //delete messages to save memory
    if (incomingData.indexOf("OK") == -1) 
      mySerial.println("AT+CMGDA=\"DEL ALL\"");
      delay(1000);
      atCommand = true;
    
    incomingData = "";
  
  if (message.indexOf("SEND") > -1)  //
    SendTextMessage();
    Serial.println("send");
  



void SendTextMessage()



  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float temp = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  mySerial.println("AT+CMGF=1");    //To send SMS in Text Mode
  delay(1000);
  mySerial.println("AT+CMGS=\"" + number + "\"\r"); // change to the phone number you using
  delay(2000);
  mySerial.print("Humidity: ");
  mySerial.print(h);
  mySerial.print(" % ");
  mySerial.print("Temperature: ");
  mySerial.print(temp);
  mySerial.println(" *C ");
  delay(200);
  mySerial.println((char)26);//the stopping character
  delay(1000);


void receivedMessage(String inputString) 

  //Get The number of the sender
  index = inputString.indexOf('"') + 1;
  inputString = inputString.substring(index);
  index = inputString.indexOf('"');
  number = inputString.substring(0, index);
  Serial.println("Number: " + number);

  //Get The Message of the sender
  index = inputString.indexOf("\n") + 1;
  message = inputString.substring(index);
  message.trim();
  Serial.println("Message: " + message);
  message.toUpperCase(); // uppercase the message received
  Serial.println("receive");

  delay(50);

【问题讨论】:

嗨!试试用LED调试,把digitalWrite(13, HIGH)放在setup()后面看。如果 LED 亮则完成 setup(),如果没有将其移到上方并查看程序停止的位置。 【参考方案1】:

我也遇到了同样的问题。 我摆脱它的唯一方法是定义所有 SerialMonitor 指令,例如:

Serial.begin(x);
Serial.println(x);

要条件编译,只有当我运行连接到笔记本电脑的程序时。所以,你可以创建一个#define 像:

#define DEBUG 1
#ifdef DEBUG
#define startupMonitor(x)     Serial.begin(x)
#define monitorPrint(x)       Serial.print(x)
#else
#define startupMonitor(x)     
#define monitorPrint(x)
#endif

当我将程序部署到 Arduino 以断开连接测试时,我注释掉了 #define。这将删除可执行代码中对 Arduino 串行监视器的串行端口的所有引用,至少对我而言 SIM800L 在断开连接时工作。

我不知道为什么会这样,但是只有两个设备使用串行端口通信,SIM 和 Arduino 本身与笔记本电脑,所以我删除了 Arduino,毕竟当断开连接时你不需要串行监控 ;)

结论:使用条件编译将生产代码与开发代码分开。

【讨论】:

【参考方案2】:

只需在 GSM 模块捕获网络后按下板上的重置按钮即可重置 Arduino。它对我有用。

【讨论】:

以上是关于我的 sim800l 仅在连接到打开串行监视器的笔记本电脑时工作的主要内容,如果未能解决你的问题,请参考以下文章

SIM800l - 禁用“短信就绪”和“呼叫就绪”未经请求的消息

处理SIM800L模块的中文短信内容

SIM800L透传模式配置

玩转 ESP32 + Arduino (十九) SIM800L调试(基于TTGO T-CALL)

iPhone - 数据 URI(css 背景图像)仅在连接到 WIFI 时有效

在信号器集线器类上设置 [Authorize] 属性仅在连接到集线器时有效,而不是在集线器上的每个方法之前(ASP.NET Core 2.2)