Python Raspberry Pi和Arduino在局域网上的通信
我正在用树莓圆周率进行图像处理,我希望它能够通过局域网与我的arduino通话,根据圆周率的指令控制光束。我见过的唯一的东西就是Pi和Arduino之间的直接联系。我可能觉得很幼稚,但我试着让他们使用Arduino作为服务器进行通信,使用以太网库编程,通过socket库使用Raspberry Pi作为客户端。我在我的路由器上给了它们两个静态IP,并使用以下代码尝试通过,但我遇到了Python Raspberry Pi和Arduino在局域网上的通信,python,sockets,networking,tcp,arduino,Python,Sockets,Networking,Tcp,Arduino,我正在用树莓圆周率进行图像处理,我希望它能够通过局域网与我的arduino通话,根据圆周率的指令控制光束。我见过的唯一的东西就是Pi和Arduino之间的直接联系。我可能觉得很幼稚,但我试着让他们使用Arduino作为服务器进行通信,使用以太网库编程,通过socket库使用Raspberry Pi作为客户端。我在我的路由器上给了它们两个静态IP,并使用以下代码尝试通过,但我遇到了socket.error:[Errno 113]没有到主机的路由,当我的python行通过特定端口连接到Arduino
socket.error:[Errno 113]没有到主机的路由,当我的python行通过特定端口连接到Arduino的IP的命令时
关于我如何能更恰当地进行这种连接,有什么想法吗?我的主要目标是能够通过局域网完成这项工作,因此USB连接和直接I2C连接没有帮助,尽管它们肯定能完成这项工作
覆盆子皮:
from socket import *
import select
data = None
timeout = 3 # timeout in seconds
msg = "test"
host = "192.168.1.113"
print ("Connecting to " + host)
port = 23
s = socket(AF_INET, SOCK_STREAM)
print "Socket made"
ready = select.select([s],[],[],timeout)
s.connect((host,port))
print("Connection made")
while True:
if data != None:
print("[INFO] Sending message...")
s.sendall(msg)
data = None
print("[INFO] Message sent.")
continue
if ready[0]: #if data is actually available for you
data = s.recv(4096)
print("[INFO] Data received")
print data
continue
阿杜伊诺:
//90-a2-da-0f-25-E7
byte mac[] = {0x90, 0xA2, 0xDA, 0x0f, 0x25, 0xE7};
//ip Address for shield
byte ip[] = {192,168,1,113};
//Use port 23
EthernetServer server = EthernetServer(23);
void setup() {
//init device
Ethernet.begin(mac,ip);
//start listening for clients
server.begin();
Serial.begin(9600); //For visual feedback on what's going on
while(!Serial){
; //cause Leonardo
}
delay(1000);
if(server.available()){
Serial.write("Client available");
}
}
void loop() {
// put your main code here, to run repeatedly:
EthernetClient client = server.available();
if (client == true){
Serial.write("Client Connected.");
if(client.read() > 0){
Serial.write(client.read());
}
else{
server.write("ping");
}
}
else{
Serial.println("No one's here yet...");
}
delay(1500);
}
#include <SPI.h>
#include <Ethernet.h>
//90-a2-da-0f-25-E7
byte mac[] = {0x90, 0xA2, 0xDA, 0x0f, 0x25, 0xE7};
//ip Address for shield
byte ip[] = {192,168,1,113};
//Use port 23 for telnet
EthernetServer server = EthernetServer(23);
void setup() {
Serial.begin(9600); //For visual feedback on what's going on
while(!Serial){
; //wait for serial to connect -- needed by Leonardo
}
Ethernet.begin(mac,ip); // init EthernetShield
delay(1000);
server.begin();
if(server.available()){
Serial.println("Client available");
}
}
void loop() {
// put your main code here, to run repeatedly:
EthernetClient client = server.available();
message = client.read();
server.write(message);
server.write("Testu ");
Serial.println(message);
// if (client == true){ <----- This check screwed it up. Not needed.
// Serial.println("Client Connected.");
// server.write(client.read()); //send back to the client whatever the client sent to us.
// }
}
在四处挖掘之后,我找到了我的解决方案,还有更多的细节。所以R-Pi和Arduino都可以做TCP,我找到了错误的根源
1) 我相信我在Arduino代码中server.begin()之后设置的延迟给了我错误,因为它会暂停程序,因此可能会暂停侦听过程
2) 我的R-Pi客户机代码中的while循环给了我一个断管错误
3) 我的Arduino的loop()
中的if(client==True)
测试不起作用。R-Pi可以连接并发送消息,没有错误,但Arduino似乎没有正确响应。当我从if
语句中取出所有内容后,R-Pi开始接收我的消息,我看到所有内容都有响应。这是我的最终代码:
R-Pi:
阿杜伊诺:
//90-a2-da-0f-25-E7
byte mac[] = {0x90, 0xA2, 0xDA, 0x0f, 0x25, 0xE7};
//ip Address for shield
byte ip[] = {192,168,1,113};
//Use port 23
EthernetServer server = EthernetServer(23);
void setup() {
//init device
Ethernet.begin(mac,ip);
//start listening for clients
server.begin();
Serial.begin(9600); //For visual feedback on what's going on
while(!Serial){
; //cause Leonardo
}
delay(1000);
if(server.available()){
Serial.write("Client available");
}
}
void loop() {
// put your main code here, to run repeatedly:
EthernetClient client = server.available();
if (client == true){
Serial.write("Client Connected.");
if(client.read() > 0){
Serial.write(client.read());
}
else{
server.write("ping");
}
}
else{
Serial.println("No one's here yet...");
}
delay(1500);
}
#include <SPI.h>
#include <Ethernet.h>
//90-a2-da-0f-25-E7
byte mac[] = {0x90, 0xA2, 0xDA, 0x0f, 0x25, 0xE7};
//ip Address for shield
byte ip[] = {192,168,1,113};
//Use port 23 for telnet
EthernetServer server = EthernetServer(23);
void setup() {
Serial.begin(9600); //For visual feedback on what's going on
while(!Serial){
; //wait for serial to connect -- needed by Leonardo
}
Ethernet.begin(mac,ip); // init EthernetShield
delay(1000);
server.begin();
if(server.available()){
Serial.println("Client available");
}
}
void loop() {
// put your main code here, to run repeatedly:
EthernetClient client = server.available();
message = client.read();
server.write(message);
server.write("Testu ");
Serial.println(message);
// if (client == true){ <----- This check screwed it up. Not needed.
// Serial.println("Client Connected.");
// server.write(client.read()); //send back to the client whatever the client sent to us.
// }
}
#包括
#包括
//90-a2-da-0f-25-E7
字节mac[]={0x90,0xA2,0xDA,0x0f,0x25,0xE7};
//屏蔽的ip地址
字节ip[]={192168,1113};
//将端口23用于telnet
EthernetServer服务器=EthernetServer(23);
无效设置(){
Serial.begin(9600);//获取有关正在发生的事情的视觉反馈
而(!串行){
;//等待串行连接——莱昂纳多需要
}
Ethernet.begin(mac,ip);//初始化EthernetShield
延迟(1000);
server.begin();
if(server.available()){
Serial.println(“客户可用”);
}
}
void循环(){
//将主代码放在此处,以便重复运行:
EthernetClient=server.available();
message=client.read();
server.write(消息);
server.write(“Testu”);
Serial.println(消息);
//如果(client==true){您是否尝试使用PC发送和接收数据只是为了确定问题出在哪里?我没有,但我最初认为可能他们的协议不兼容或其他什么。您认为我应该能够进行这种直接连接?无论如何,我会尝试并返回