第一次发帖,总体来说我对编码也很陌生。
问题就在这里。我为 Arduino uno R4 编写了一些代码,每分钟向 4 个 Arduino Nano esp32-s3 发送一个 UDP 数据包。 Nanos 应返回 UDP 请求,其中包含包含从传感器读取的温度和湿度的数据包。代码在前 13 分钟左右运行良好,然后 Nano 冻结。
Arduino Uno R4 每分钟向 Nano 发送一个数据包。数据包的全部内容是“Temp?”。 我注意到一些奇怪的事情是冻结经常发生在 UDP 请求之间。这让我认为无论问题是什么,UPD 数据包的处理都不会发生。
我已经检查过的事情。
我有点陷入困境,所以任何帮助将不胜感激。
#include <DHT11.h>
#include <SPI.h>
#include <WiFi.h>
#include <WiFiUdp.h>
int CNT = 0;
int ID = 2;
DHT11 dht11(2);
char SSID[] = "IOT";
char pass[] = "SSN690am!";
unsigned int localPort = 2390;
char packetBuffer[255];
char qryTemp[] = "Temp?";
WiFiUDP Udp;
void setup() {
// Initialize serial communication to allow debugging and data readout.
// Using a baud rate of 9600 bps.
Serial.begin(9600);
// Connect to WPA/WPA2 network:
WiFi.begin(SSID, pass);
Udp.begin(localPort);
}
void loop() {
int temp = 0;
int humidity = 0;
int result = dht11.readTemperatureHumidity(temp, humidity);
int packetSize = Udp.parsePacket();
Serial.print(packetSize);
if (packetSize) {
Serial.printf("\nStack:%d,Heap:%lu\n", uxTaskGetStackHighWaterMark(NULL), (unsigned long)ESP.getFreeHeap());
Serial.print("MSG COUNT:");
Serial.println(CNT);
CNT++;
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
Serial.print(Udp.remoteIP());
Serial.print(", port ");
Serial.println(Udp.remotePort());
// read the packet into packetBufffer
int len = Udp.read(packetBuffer, 255);
if (len > 0) {
packetBuffer[len] = 0;
}
Serial.println("Contents:");
Serial.println(packetBuffer);
if(int(packetBuffer[0]) == 84 and int(packetBuffer[1]) == 101 and int(packetBuffer[2]) == 109 and int(packetBuffer[3]) == 112 and int(packetBuffer[4]) == 63){
// send a reply, to the IP address and port that sent us the packet we received
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(char(ID));
Udp.write(char(temp));
Udp.write(char(humidity));
Udp.endPacket();
Udp.flush();
}
}
}
问题解决了!!
每次循环查询 Dht11 传感器的温度和湿度值都会导致冻结。我猜测它使 I2C 总线过载并导致崩溃。
无论哪种方式,当代码更改为仅在收到 UDP 请求时查询传感器时,都解决了问题。