Arduino EtherCard UDP:不断重复

时间:2015-07-19 16:08:05

标签: sockets arduino udp ethercard

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数据包(我知道事实并非如此)。看起来我错过了一些愚蠢的东西,看不出发生了什么。

1 个答案:

答案 0 :(得分:0)

所以正确答案是......

嗯,它与编程无关。另一方面,它与电子产品有很大关系 - 当Arduino(和电路)由USB供电并且由正常供电时,我测量的电源电压不同电源。解决方案是:添加一个上拉电阻来补偿这一点,并使用不同的代码分支进行USB和&#34;生产&#34;模式。此外,通过USB 使用电源进行连接时进行开发也是一件事,并且工作得相当好。