通过TCP从arduino发送数据到python

时间:2014-10-08 23:21:33

标签: python tcp arduino

我现在已经挣扎了好几个小时了,真的只是不知道从哪里开始。我有一个连接到网络的无线网罩的arduino uno,以及连接到同一网络的Ubuntu笔记本电脑。我使用arduino Wifi Library连接到网络。

我可以从arduino将数据发送到我的笔记本电脑并使用以下方式成功打印:sudo nc -l 25565

我也尝试使用以下python代码执行与nc相同的操作,它也以sudo运行,以防万一:

#!/usr/bin/env python

import socket

TCP_IP = '127.0.0.1'
TCP_PORT = 25565
BUFFER_SIZE = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP,TCP_PORT))
s.listen(1)

(conn,addr) = s.accept()
print 'Connection address: ',addr
while True:
    data = conn.recv(BUFFER_SIZE)
    if not data: break
    print 'received data: ',data
    conn.send('ECHO')
conn.close()
s.close()

但它只是挂在(conn,addr) = s.accept()。在同一台笔记本电脑上使用客户端python脚本,我可以连接到上面的服务器,然后我可以将数据发送到服务器然后打印的数据。

我只是不知道为什么nc将从arduino中打印出来但python服务器脚本不会被打败,即使它将从python客户端打印出来。 arduino库可能无法遵循python期望的某些标准吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

不,arduino库不是“无法遵循某些标准”。

您的程序绑定到localhost接口,IP地址127.0.0.1。这意味着只有在同一台PC上运行的程序才能连接到您的Python服务器。

试试这个:

s.bind(('',TCP_PORT))

参考:

https://docs.python.org/2/library/socket.html

  

对于IPv4地址,接受两种特殊形式而不是主机地址:空字符串代表INADDR_ANY,字符串'<broadcast>'代表INADDR_BROADCAST。 IPv6的行为不可用于向后兼容,因此,如果您打算使用Python程序支持IPv6,则可能需要避免这些行为。

https://docs.python.org/2/howto/sockets.html#creating-a-socket

  

需要注意的几点:我们使用了socket.gethostname(),以便外部世界可以看到套接字。如果我们使用了s.bind(('localhost',80))或s.bind(('127.0.0.1',80))我们仍然会有一个“服务器”套接字,但只能在同一个套接字中看到机。 s.bind(('',80))指定套接字可以通过机器碰巧拥有的任何地址访问。