一例python实现的基于事件响应方式的串口封装

暂时只实现串口,socket(tcp/udp), http等其他方式的后续加上
open points:
1.不知是否可以在实例化时控制串口默认为关闭状态?
2.在串口实例运行过程中,若要修改串口参数,比如波特率或奇偶校验属性,是否会在线程类中出现异常?(目前正在研究协程,目测用协程可以归避此类问题,后续更新…)

CommBase.py

# -*- coding: utf-8 -*-
# @Time    : 2019/4/1
# @Author  : 
# @Email   : 
# @File    : CommBase.py
# @Software:
from serial.rs485 import RS485Settings

class CommBase(object):
    def __init__(self):
        self.cbOnRead = None
    
    def IsOpen(self):
        pass

    def Open(self, settings):
        pass

    def Close(self):
        pass

    def Write(self, sendData):
        pass

    def RegstOnReadEvt(self, callback):
        pass

CommSerialPort.py

# -*- coding: utf-8 -*-
'''
Created on 2019��5��21��

@author: fredl
'''
from CommService.comm.CommBase import CommBase
import serial
import threading
import time
from logPrinter.LogPrinter import _LogingInit_,_DEBUG_,_INFO_,_ERROR_

class CommSerialPort(CommBase):
    '''
    classdocs
    '''


    def __init__(self):
        CommBase.__init__(self)
        self.m_serial = None
        self.m_com       = 'COM3'
        self.m_BaudRates = 115200
        self.m_ByteSizes = 8
        self.m_Parities  = 'N'
        self.m_StopBits  = 1
        
        self.serialRecvThread = TSerialRecvThread(None, None)
        self.serialRecvThread.m_pause = True
        self.serialRecvThread.start()

    def IsOpen(self):
        return self.m_serial.is_open

    def Open(self, settings):
        if self.m_serial is not None:
            if self.IsOpen():
                self.Close()
        self.m_serial = serial.Serial(port     = self.m_com,
                                      baudrate = self.m_BaudRates,
                                      bytesize = self.m_ByteSizes,
                                      parity   = self.m_Parities,
                                      stopbits = self.m_StopBits)

        self.serialRecvThread.setSerialInst(self.m_serial)
        self.serialRecvThread.m_pause = False
        return True

    def Close(self):
        self.serialRecvThread.m_pause = True
        #self.serialRecvThread.join()
        if self.m_serial:
            self.m_serial.close()

    def SendData(self, sendData):
        if not self.m_serial:
            return False
        self.m_serial.write(sendData)
        return True

    def RegstOnRead(self, cbEvent):
        self.serialRecvThread.m_cbOnRead = cbEvent

# serial recv thread
class TSerialRecvThread (threading.Thread):
    def __init__(self, serial, callbackOnRead):
        threading.Thread.__init__(self)
        self.m_serialInst = serial
        self.m_cbOnRead   = callbackOnRead
        self.m_toStop     = False
        self.m_pause      = True

    def setSerialInst(self, serialInst):
        self.m_serialInst = serialInst

    def run(self):
        _INFO_('serial recv thread start...')
        self.m_pause = False
        while True:
            try:
                if self.m_toStop == True:
                    _INFO_('serial recv thread is stopped...')
                    break
                if self.m_pause == True:
                    _INFO_('serial recv thread is pause...')
                    time.sleep(1)
                    continue
                if self.m_serialInst == None:
                    print('serial is none...')
                    time.sleep(1)
                    continue
                #check if port is opened
                if not self.m_serialInst.is_open:
                    _INFO_('serial not open!!!')
                    continue
                nRecvCount = self.m_serialInst.inWaiting()
                if nRecvCount:
                    strRecvData = self.m_serialInst.read(nRecvCount)
                    if not self.m_cbOnRead is None:
                        self.m_cbOnRead(strRecvData)
                else:
                    time.sleep(0.1)
            except :
                _ERROR_('serial error!!!')
                break

    def stop(self):
        #_INFO_('serial recv thread will be stopped...')
        self.toStop = True

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值