我正在使用树莓派进行图像处理,我希望它能够通过 LAN 与我的 arduino 通信,以根据树莓派的指令控制光束。我唯一经常看到的是 Pi 和 Arduino 之间的直接连接。我可能看起来很天真,但我试图让他们使用 Arduino 作为服务器进行通信,使用以太网库进行编程,并通过套接字库将 Raspberry Pi 作为客户端进行通信。我在我的路由器上给了他们两个静态 IP,并使用以下代码尝试通过,但是当我的 python 行出现时,我遇到了 socket.error: [Errno 113] No route to host通过特定端口连接到 Arduino 的 IP 的命令。
关于如何更正确地建立这种联系有什么想法吗?我的主要目标是能够通过 LAN 执行此操作,因此 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);
}
最佳答案
在四处挖掘之后,我找到了我的解决方案,以及一些更多的细节。所以 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:
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")
if ready[0]: #if data is actually available for you
print("[INFO] Sending message...")
s.sendall(msg)
print("[INFO] Message sent.")
data = s.recv(4096)
print("[INFO] Data received")
print data
阿杜伊诺:
#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.
// }
}
关于python - 通过局域网在树莓派和 Arduino 之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31193686/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m