Python recvfrom缓冲区太慢

时间:2016-11-28 14:38:30

标签: python matlab real-time simulink recvfrom

我使用的是预编译脚本,因为我是一个Python noob,并且在插件编程方面遇到了一些麻烦。

我使用两台计算机,一台运行Matlab / Simulink实时应用程序,它通过UDP将数据发送到我的Windows笔记本电脑。数据包含光标的XY坐标和目标,目标半径和颜色(总共6个信号)。在笔记本电脑上,我正在运行一个python脚本,理想情况下会读出udp信号并在给定坐标的辅助屏幕上实时绘制椭圆(或接近实时)。 不幸的是,执行速度可能不够快,无法跟上以1000Hz发送的UDP信号。这导致发送信号的变化在屏幕上显示之间的大约40秒的大量延迟。

如果我是正确的,问题出在recvfrom命令中。收到的数据存储在某种缓冲区中,并以FIFO样式显示,而不是以1000Hz实时显示所有内容。问题是我不知道如何解决这个问题。关于套接字编程的大多数解释都是我的想法。它不需要以1000Hz显示,50Hz也没问题,但是尽快显示更改会非常好。我想读取最后收到的数据而不是FIFO。

任何人都可以帮助我吗?提前谢谢。

import socket
import struct
from PySide import QtGui
from PySide import QtCore
import random
import ctypes
import sys
import time
import math

UDP_IP = "192.168.1.25" #server
UDP_PORT = 25000 #server

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT)) #


class MyGui(QtGui.QWidget):

    def __init__(self):

        super(MyGui,self).__init__()

        #self.screen()
        user32 = ctypes.windll.user32
        self._W = user32.GetSystemMetrics(0)
        self._H = user32.GetSystemMetrics(1)
        self._rW = random.random()
        self._rH = random.random()
        self._rR = random.random()
        self._rC = 500

        self._CursorX = 0
        self._CursorY = 0
        self._CursorXt = 0
        self._CursorYt = 0
        self._CursorRt = 0
        self._Color = 0    

        print(self.geometry())
        self._W = self.width()
        self.setStyleSheet("background-color: black")
        self.setGeometry(QtCore.QRect(2000,50,500,300))
        self.showFullScreen()


    def paintEvent(self, e):
        qp = QtGui.QPainter()
        qp.begin(self)
        self._drawTarget(qp)
        self._drawCursor(qp)
        qp.end()

    def _drawTarget(self, qpT):

        # color1 = QtGui.QColor()
        # color1.setNamedColor('#d4d4d4')

        color1=QtGui.QColor(self._Color)

        qpT.setPen(color1)

        qpT.setBrush(QtGui.QColor(self._Color))
        qpT.drawEllipse(QtCore.QPointF(self._CursorXt, self._CursorYt), self._CursorRt, self._CursorRt)

    def _drawCursor(self, qpC):

        color2 = QtGui.QColor(0, 0, 0)
        color2.setNamedColor('#FFFF00')
        qpC.setPen(color2)

        qpC.setBrush(QtGui.QColor('#FFFF00'))
        qpC.drawEllipse(QtCore.QPointF(self._CursorX, self._CursorY), 20, 20)

    def mousePressEvent(self, QMouseEvent):
        print ("mouse position")
        print (QMouseEvent.pos())

    def setCursorPosition(self,x,y,xt,yt,Rt,color):
        self._CursorX = x
        self._CursorY = y
        self._CursorXt = xt
        self._CursorYt = yt
        self._CursorRt = Rt
        self._Color = color 
        self.update()



class MyProcess:
    def __init__(self, whichGui):
        self._x = 0
        self._y = 0 
        self._xt = 0
        self._yt = 0
        self._Rt = 0
        self._color = 0
        self._whichGui = whichGui
        self._T = QtCore.QTimer()
        self._T.timeout.connect(self._update)
        self._T.start(30)

    def _update(self):

        data, addr = sock.recvfrom(8*6)
        #print ("received message:", data)
        value = struct.unpack('dddddd', data)
        #print (value)
        self._xt = value[0]
        self._yt = value[1]
        self._Rt = value[2]
        self._x = value[3]
        self._y = value[4]
        self._color = value[5]
        self._whichGui.setCursorPosition(self._x, self._y, self._xt, self._yt, self._Rt, self._color)


# Run the Graph
G = MyGui()
G.show()


P = MyProcess(G)

0 个答案:

没有答案