TL; DR Arduino发送UDP两次,但它会在接收端不停发送它。
我有一个连接到Arduino的无线门铃。这是我用来从Arduino使用ENC28J60和EtherCard发送UDP数据包的代码:
#include "Network.h"
#include <HardwareSerial.h>
#include <EtherCard.h>
// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte udp_broadcast[] = {0xFF, 0xFF, 0xFF, 0xFF};
static const char KEEP_ALIVE[] = "keep-alive";
byte Ethernet::buffer[700];
Network::Network(unsigned short udp_port)
: ethernet_initialised_(false) {
this->udp_port_ = udp_port;
Serial.println("Starting Network class on port " + udp_port);
if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) {
Serial.println(F("Failed to access Ethernet controller"));
return;
}
if (!ether.dhcpSetup()) {
Serial.println(F("DHCP failed"));
return;
}
ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);
Serial.println("Initialization completed");
ethernet_initialised_ = true;
}
Network::~Network() {
}
void Network::broadcast(const char* message) {
if (ethernet_initialised_) {
ether.sendUdp(
message,
strlen(message),
udp_port_,
udp_broadcast,
udp_port_ + 1);
}
}
调用代码实际上发送两个UDP数据包(TL; DR测量代码的工作方式)。基本上,像这样:
void loop(){
float val = analogRead(inputPin);
if (val > 5.0f) {
Serial.println("");
Serial.println(val);
network->broadcast("HELLO");
delay(5000);
}
}
这是我在客户端上阅读的方式:
while True:
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, port))
print "Waiting for data..."
data, addr = sock.recvfrom(1024)
callback(addr, data)
所以我完全不理解的是:为什么在触发门铃后我的呼叫代码会不断打印出来
Doorbell rang: HELLO ('192.168.0.2', 31715)
Waiting for data...
Doorbell rang: HELLO ('192.168.0.2', 31715)
Waiting for data...
Doorbell rang: HELLO ('192.168.0.2', 31715)
Waiting for data...
Doorbell rang: HELLO ('192.168.0.2', 31715)
Waiting for data...
...
...
好像Arduino正在发送UDP数据包(我知道事实并非如此)。看起来我错过了一些愚蠢的东西,看不出发生了什么。
答案 0 :(得分:0)
所以正确答案是......
嗯,它与编程无关。另一方面,它与电子产品有很大关系 - 当Arduino(和电路)由USB供电并且由正常供电时,我测量的电源电压不同电源。解决方案是:添加一个上拉电阻来补偿这一点,并使用不同的代码分支进行USB和&#34;生产&#34;模式。此外,通过USB 和使用电源进行连接时进行开发也是一件事,并且工作得相当好。