繁体   English   中英

通过TCP从arduino发送数据到python

[英]Sending data over TCP from arduino to python

我已经为此奋斗了几个小时,实际上只是不知道从这里出发。 我有一个arduino uno,它的wifi屏蔽连接到网络,一台笔记本电脑,Ubuntu连接到同一网络。 我正在使用arduino Wifi库连接到网络。

我可以将数据从arduino发送到我的笔记本电脑,并使用以下sudo nc -l 25565成功打印: 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期望的某些标准? 提前致谢。

不,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))指定套接字可以由机器碰巧拥有的任何地址访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM