功能需求 1.发送方通过UDP发送到我这原始数据(十六进制),将原始数据按照n个字节拆分并计算成int数组。 2.将得到的数据通过动态折线图显示出来。 3.线程间通信(队列),因为动态计算函数也是一个死循环。 代码如下:
import queue
import socket
import threading
from matplotlib import pyplot as plt, animation
from matplotlib.animation import FuncAnimation
import numpy as np
import time
#本机IP和用来接收UDP消息的端口号
ip="10.10.10.103"
port=775
data=[]
#创建一个队列
q=queue.Queue()
class thread(threading.Thread):
def __init__(self,q):
threading.Thread.__init__(self)
self.q=q
def run(self):
# 1创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定一个本地信息
localaddr = (ip, port) # 必须绑定自己电脑IP和port
udp_socket.bind(localaddr)
#获取UDP数据
while True:
recv_data = udp_socket.recvfrom(20000)
recv_msg = recv_data[0] # 信息内容
send_addr = recv_data[1] # 信息地址
print("dat:",recv_msg)
self.q.put(recv_msg)
#5.退出套接字
udp_socket.close()
def main():
lock = threading.Lock()
t1 = thread(q)
t1.start()
# 初始化画布
fig = plt.figure()
plt.grid(ls='--')
plt.xlim(0, 8192)
plt.ylim(0, 65535)
# x = np.linspace(0, 2 * np.pi, 40)
# print("x",x)
# y=np.random.randint(0,50,size = 40)
# print("y",y)
x = [1, 2]
y = [1, 2]
# 绘制起始图
myplot = plt.plot(x, y)[0]
print(type(myplot))
def updata(n):
if not q.empty():
b=q.get()
#按照字节转换为字节数组
#one=bytesToArrary(b,2)
two=bytesToArrary(b,2)
# three=bytesToArrary(b,3)
print("data123",b,type(b))
print("two:",two)
xs = indexToList(two)
ys = two
# xs=[n+1,n+2,n+3]
# ys=[n+3,n+4,n+3]
print("xs",xs)
print("ys",ys)
myplot.set_data(xs, ys)
return myplot
ani = animation.FuncAnimation(fig=fig, func=updata, frames=np.arange(0, 100), interval=10)
plt.show()
#字节数组转化
def bytesToArrary(bytes,n):
data = []
ls = [bytes[i:i + n] for i in range(len(bytes)) if i % n== 0] # 每3个字节分隔组成list
#将字节数组转换为int数组
for item in ls:
data.append(int.from_bytes(item, byteorder='big', signed=False))
return data
#将列表的索引转化为列表
def indexToList(list):
a=[]
b = range(1, len(list) + 1)
for i in b:
a.append(i)
return a
if __name__ == "__main__":
main()
|