2016-03-07 44 views
0

我试图打开Arduino的Galielo Gen 2和Python客户端之间的UDP套接字数据包发送给Python客户端。我想将温度传感器捕获的值从arduino发送到客户端,并接收客户端的响应。不能使用Arduino的UDP套接字以太网

的Arduino代码:

#include <Ethernet.h> //Load Ethernet Library 
#include <EthernetUdp.h> //Load UDP Library 
#include <SPI.h> //Load the SPI Library 

byte mac[] = { 0x98, 0x4F, 0xEE, 0x01, 0xF1, 0xBE }; //Assign a mac address 
IPAddress ip(192,168,1,207); 
//IPAddress gateway(192,168,1, 1); 
//IPAddress subnet(255, 255, 255, 0); 
unsigned int localPort = 5454; 
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; 
String datReq; 
int packetSize; 
EthernetUDP Udp; 

void setup() { 
Serial.begin(9600); 
Ethernet.begin(mac, ip); 
Udp.begin(localPort); 
delay(2000); 
} 

void loop() { 

    int sensor = analogRead (A0); 
    float voltage = ((sensor*5.0)/1023.0); 
    float temp = voltage *100; 
    Serial.println(temp); 
    packetSize = Udp.parsePacket(); 
    if(packetSize>0) 
    { 
    Serial.print("Received packet of size "); 
    Serial.println(packetSize); 
    Serial.print("From "); 
    IPAddress remote = Udp.remoteIP(); 
    for (int i =0; i < 4; i++) 
    { 
     Serial.print(remote[i], DEC); 
     if (i < 3) 
     { 
     Serial.print("."); 
     } 
    } 
    Serial.print(", port "); 
    Serial.println(Udp.remotePort()); 

    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); 
    Serial.println("Contents:"); 
    Serial.println(packetBuffer); 
    String datReq(packetBuffer); 
    Udp.beginPacket(Udp.remoteIP(), 5454); 
    Udp.print(temp); 
    Udp.endPacket(); 
    } 
    delay(50); 
} 

Python代码:

from socket import * 
import time 

address = ('192.168.1.207', 5454) 
client_socket = socket(AF_INET, SOCK_DGRAM) 
client_socket.settimeout(5) 

while(1): 

    data = "Temperature" 
    client_socket.sendto(data, address) 
    rec_data, addr = client_socket.recvfrom(2048) 
    print rec_data 

试图代码后,这是在Arduino的结果:

接收大小11 的包从255.255.255.255,端口0 内容: 温度

在蟒蛇,我得到这个消息: 回溯(最近通话最后一个): 文件 “C:/Users/enwan/Desktop/te/temp.py”,第12行,在 rec_data,地址= client_socket.recvfrom( 2048) 超时:超时

任何帮助吗?

回答

1

您还没有初始化运行的Python代码的计算机的地址。

IPAddress remote = Udp.remoteIP(); 

这被初始化为地址255.255.255.255,这不是有效的IP地址。它似乎没有获得远程IP。

另外,远程端口心不是被在下面的行检索,并且被设置为0的默认值:

Udp.remotePort() 

因此Arduino是试图将数据发送到IP地址255.255.255.255在端口0.因此,由于arduino没有正确地寻址PC,python代码有一个超时。

您将需要直接解决您的蟒蛇PC,即。设置:

IPAddress remoteip(192,168,1,X);  // whatever your PC ip address is 
Udp.beginPacket(remoteip, 5454); 
Udp.print(temp); 
Udp.endPacket(); 

有可能是与UDP库设置根据你的Arduino的接收数据包的IP和端口的方式,但你必须要读入如何获得这些信息。

0

你永远不会在你的Python脚本称为绑定()到您的UDP套接字绑定到一个端口,所以OS不知道,你希望你的UDP套接字收到任何数据包,因此从来没有经过你的任何数据包。

下面是你需要具备什么:

client_socket = socket(AF_INET, SOCK_DGRAM) 
client_socket.bind(("", portNum)) # where portNum is the port number your Arduino is sending to 
[...] 
rec_data, addr = client_socket.recvfrom(2048)