IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Python 基于Threading的UdpServer和Serial的类 -> 正文阅读

[网络协议]Python 基于Threading的UdpServer和Serial的类

Summary

将udpserver和Serial的对象进行包装,分别使用独立线程来维护。
实现的功能:

  1. UDP端接收的数据从串口发出,串口接收的数据从UDP端发出

SerialThreadBase.py

import serial
import serial.tools.list_ports
import threading
from queue import Queue
import time


class serialThreadBase(threading.Thread):
    def __init__(self,name,serial:serial.Serial,inQueue:Queue,outQueue:Queue,interval:float) -> None:
        super(serialThreadBase,self).__init__(daemon=True)
        self.serial=serial
        self.inQueue=inQueue
        self.outQueue=outQueue
        self.isRuning=False
        self.name=name
        self.interval=interval
    
    def run(self) -> None:
        print(self.name+' start.')
        while(True):
            time.sleep(self.interval)
            try:
                if self.serial.isOpen():
                    if self.inQueue is not None:
                        if not self.inQueue.empty():
                            buffer=self.inQueue.get()
                            if buffer is not None:
                                self.serial.write(buffer)
                          #time.sleep(0.1)
                    
                    if self.serial.in_waiting:
                        readbuffer=self.serial.read_all()
                        if self.outQueue is not None:
                            if not self.outQueue.full():
                                self.outQueue.put(readbuffer)
                else:
                    try:
                        self.serial.open()
                    except Exception as ex:
                        print(ex)
                        time.sleep(1)
            except Exception as ex:
                print(ex)
                time.sleep(1)
                self.serial.close()

udpServerThreadBase.py

import socket
import threading
from queue import Queue
import time

class udpServerThreadBase(threading.Thread):
    def __init__(self,name,udpServer:socket.socket,listenPort:int,inQueue:Queue,outQueue:Queue,interval:float) -> None:
        super().__init__(daemon=True)
        self.name=name
        self.udpServer=udpServer
        self.inQueue=inQueue
        self.outQueue=outQueue
        self.interval=interval
        self.client=None
        self.port=listenPort
    
    def run(self) -> None:
        print(self.name+'start.')
        try:
            self.udpServer.bind((('0.0.0.0'),self.port))
            self.udpServer.setblocking(0)
            while(True):
                time.sleep(self.interval)
                try:
                    if self.client is not None: # client is determined
                        if self.inQueue is not None:
                            if not self.inQueue.empty(): # message need to send
                                buffer=self.inQueue.get()
                                if buffer is not None: # ensure buffer is good
                                    self.udpServer.sendto(buffer,self.client)
                    message,self.client=self.udpServer.recvfrom(1024)
                    if message is not None:
                        if self.outQueue is not None:
                            if not self.outQueue.full():
                                self.outQueue.put(message)
                except BlockingIOError:
                    pass
        except BaseException as ex:
            print(ex)
            time.sleep(1)

main.py


from queue import Queue
import threading
import serial
import time
import socket

from serialThreadBase import serialThreadBase
from udpServerThreadBase import udpServerThreadBase


sendQueue=Queue()
recvQueue=Queue()

netSendQueue=Queue()
netRecvQueue=Queue()

def main():
    global sendQueue,recvQueue
    comSerial=serial.Serial()
    comSerial.baudrate=115200
    comSerial.setPort("COM21")
    comThread=serialThreadBase('ComThread',comSerial,sendQueue,recvQueue,0.02)
    comThread.start()

    udpServer=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    udpThread=udpServerThreadBase('UdpThread',udpServer,10080,netSendQueue,netRecvQueue,0.02)
    udpThread.start()

    while(1):
        if not netRecvQueue.empty():
            sendQueue.put(netRecvQueue.get())
        if not recvQueue.empty():
            netSendQueue.put(recvQueue.get())
        time.sleep(0.1)


if __name__=='__main__':
    try:
        main()
    except KeyboardInterrupt:
        pass

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:52:13  更:2021-12-24 18:53:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:31:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码