树莓派上的WiFi上的Python套接字

认识德赛

我已经在python中编写了一个套接字。基本上有2个树莓派互相交谈,并使用套接字通过wifi发送gpio数据。该代码有时可以很好地工作,但有时它不起作用或显示很多滞后。有什么可能的问题。我错过了什么吗?我是网络和python的新手。请帮我!!

服务器代码是

#!/usr/bin/python
import RPi.GPIO as GPIO
import socket
HOST='192.168.0.106'
PORT=5002
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr=s.accept()
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
print 'Connected by', addr
GPIO.setmode(GPIO.BCM)
GPIO.setup(04, GPIO.IN)
GPIO.setup(17, GPIO.IN)
GPIO.setup(27, GPIO.IN)
while True:
    if (GPIO.input(04)==True):
        if (GPIO.input(17)==False):
                if (GPIO.input(27)==False):
                        conn.send('0')
                elif(GPIO.input(27)==True):
                        conn.send('1')
        elif (GPIO.input(17)==True):
                if (GPIO.input(27)==False):
                        conn.send('2')
                elif (GPIO.input(27)==True):
                        conn.send('3')
    elif (GPIO.input(04)==False):
        conn.send('5')
s.close()

客户端代码在这里

#!/usr/bin/python
import socket
import RPi.GPIO as GPIO
HOST='192.168.0.106'
PORT=5002
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
GPIO.setmode(GPIO.BCM)
GPIO.setup(02, GPIO.OUT)
GPIO.setup(03, GPIO.OUT)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(10, GPIO.OUT)
while 1:
    data=s.recv(8096)
    if data=='0':
            print 'Forward'
            GPIO.output(02,True)
            GPIO.output(03, False)
            GPIO.output(11, False)
    elif data=='1':
            print 'Backward'
            GPIO.output(02, False)
            GPIO.output(03, True)
            GPIO.output(11, True)
            GPIO.output(10, False)
    elif data=='2':
            print 'Left'
            GPIO.output(02, False)
            GPIO.output(03, False)
            GPIO.output(11, False)
            GPIO.output(10, True)
    elif data=='3':
            print 'Right'
            GPIO.output(02, True)
            GPIO.output(03, False)
            GPIO.output(11, False)
            GPIO.output(10, False)
    elif data=='5':
            print 'Stop'
            GPIO.output(02, False)
            GPIO.output(03, False)
            GPIO.output(11, False)
            GPIO.output(10, False)
s.close()
让·保罗·卡德隆(Jean-Paul Calderone)

有些事情不是您的代码惯用的。还有一些事情可能会改变其行为。

if (GPIO.input(04)==True):

您应该这样编写此语句:

if GPIO.input(4):

我删除的括号是完全多余的。他们没有区别。

我也更改044因为04是八进制文字。对于此特定值,这没有什么区别,因为八进制4和十进制4是相同的值。但是,在此处使用八进制是令人困惑且令人惊讶的(如果习惯使用八进制来指代GPIO引脚可能是在此处使用八进制的原因,但据我所知不是)。由于您的密码是8或更大,因此此处未使用八进制表示法编写,因此我猜这是无意的。

我还删除了与的显式比较True您几乎绝对不能与进行比较TrueGPIO.input(4) == True评估True是否GPIO.input(4)返回True因此,您也可以跳过额外的比较(或者从另一个角度来看,为什么不写if (GPIO.input(4) == True) == True:?)。

类似这样的行:

if (GPIO.input(27)==False):

您应该这样写:

if not GPIO.input(27):

您几乎永远都不能与False任何一个进行比较

也许更严重的是:

if (GPIO.input(27)==False):
    conn.send('0')
elif(GPIO.input(27)==True):
    conn.send('1')

我认为在程序的这一点上两次对该引脚进行采样对您的应用程序并不重要-但这就是您正在做的。第一个调用很可能GPIO.input(27)会返回True,而第二个调用会很容易返回False在这种情况下,您的程序将不会采取任何措施-谁知道后果如何。

相反,您应该编写如下内容:

if GPIO.input(27):
    conn.send('1')
else:
    conn.send('0')

也许最重要的是

while 1:
    data=s.recv(8096)
    if data=='0':

这是套接字API的滥用。您最多请求8096个字节,然后就好像最多请求了1个字节一样处理结果。伴随程序始终一次写入1个字节都没关系。TCP允许将这些写入合并在一起。

相反,您应该写:

while 1:
    data = s.recv(1)
    if data=='0':

好吧,这并不是真正理想的编写方法,但这是使代码按预期执行的最小更改。

目前尚不清楚这是否与您遇到的问题有关,但缺少您的特定硬件,我怀疑有人真的可以重现该问题。

在用代码解决了这些问题之后,您的下一个调试步骤应该是缩小延迟首次出现的位置。

也许发送端的GPIO引脚受到干扰,并且数据停止从它们发出。在某些输入下,GPIO库中的某些行为可能不正确。也许是其中一个raspberrypis上的网络堆栈出现了问题-由于资源限制,硬件故障或其他我无法猜到的问题-等等。

因此,对发送方进行检测,以便您可以判断发送方是否定期发送数据,或者是否在其中引入了延迟。如果它定期发送数据,则对接收器进行检测以查看其是否定期接收数据。如果是这样,那么您可能会把问题缩小到GPIO库或接收侧的引脚上。

仪器可以非常简单。例如,尝试time.time()在循环中放入一些打印内容以及对调用的内容。这将使您看到循环主体运行的频率。如果您发现时间差距,那么您就有第一个线索。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

树莓派上Vim的Solarized主题

来自分类Dev

套接字错误-python

来自分类Dev

Python套接字实现

来自分类Dev

在树莓派上自动启动

来自分类Dev

在树莓派上使用python进行SSH / SCP(或类似功能)

来自分类Dev

树莓派上的JavaFX动画

来自分类Dev

在树莓派上升级opencv

来自分类Dev

Python套接字编程

来自分类Dev

无法在树莓派上为python3.4安装urllib3

来自分类Dev

python套接字获取

来自分类Dev

从PHP网站执行python脚本-我需要Django吗?可以在树莓派上完成吗?

来自分类Dev

如何在树莓派上更新到最新的python 3.5.1版本?

来自分类Dev

树莓派上的python mqtt脚本发送和接收消息

来自分类Dev

Python套接字服务器未在树莓派中连接

来自分类Dev

尝试在树莓派上托管python套接字服务器时出现ConnectionRefusedError

来自分类Dev

Python sounddevice在树莓派上不产生声音

来自分类Dev

树莓派上php-cgi中的Java程序上的exec()

来自分类Dev

树莓派上的WiFi上的Python套接字

来自分类Dev

在树莓派上自动启动

来自分类Dev

在树莓派上使用python进行SSH / SCP(或类似功能)

来自分类Dev

如何在树莓派上使用r8188eu驱动程序使用wifi?

来自分类Dev

在树莓派上打开同步端口

来自分类Dev

CMake无法在树莓派上编译

来自分类Dev

通过plink在树莓派上启动Python脚本(不响应crontab)

来自分类Dev

树莓派上的pip安装失败

来自分类Dev

Python套接字:如何在同一wifi上的两台计算机之间进行连接

来自分类Dev

重启后树莓派上的 Python 虚拟环境错误

来自分类Dev

使用 QT creator 在树莓派上通过 Wifi 执行简单的终端命令

来自分类Dev

字符串到 int/float 转换在树莓派上的 python 中不起作用

Related 相关文章

热门标签

归档