python 打开多个串口发送数据的测试

 

# -*- coding: utf-8 -*-
import serial,time,threading,struct

# pip install pyserial
class SerialsMng():
    # list=[name,bps,pixStyle,width,  name,bps,pixStyle,width,]
    #["COM3",250000,0x13, 45,"COM4",250000,0x13, 45]
    def __init__(self,lst):

        self.ser_count=int(len(lst)/4)
        self.ser_arr=[]
        for x in range(0,self.ser_count):
            idx=x*4
            sop = SerialOP(lst[idx],lst[idx+1],lst[idx+2],lst[idx+3])
            print(lst[idx],lst[idx+1],lst[idx+2],lst[idx+3])
            self.ser_arr.append(sop)
        print(self.ser_arr)
    def setdata(self,idx,data):
        sop=self.ser_arr[idx]
        sop.d.setDataToArray(data)
    def setdataAndsend(self,idx,data):

        sop = self.ser_arr[idx]
        #print("xxxxxxxxxxxxxxxxxxx")
        #print( data)
        #print(sop.d.pkgLen)
        if not sop.busy:
            sop.d.setDataToArray(data)
            #print(sop.d.buf)
            sop.serialSend()


    def splitData(self,data,sidx=0,eidx=0):
        b= eidx<=len(data) and sidx>=0 and eidx-sidx>0
        if(b):
            d= data[sidx:eidx]
            return b,d
        return False,[]
    def sendFrameData(self,data,pixstyle=4,width=45,height=15):
        datlen = len(self.ser_arr)
        #每个串口设备控制一行
        c=0
        u=pixstyle*width
        #print(u)
        for x in range(datlen):#

            #获取切割的数据,发送到对应的节点
            b,d= self.splitData(data,c * u, (c + 1) * u)
            #print(c, c * u, (c + 1) * u,b,d)
            if b:
                #串口发送1

                self.setdataAndsend(x,d)
            c+=1
    def sendFrameData_splited(self,data):
        dvclen = len(self.ser_arr)

        datlen = len(data)
        #每个串口设备控制 data 一个子数组的数据
        if dvclen<datlen:
            datlen=dvclen
        #print(u)
        for x in range(datlen):#
                self.setdataAndsend(x,data[x])


from frame_data import FrameData
import struct
from ctypes import create_string_buffer


class SerialOP():
    no_error=True
    def __init__(self, serialPort, baudRate,pixStyle,width=45):
        # 打开串口
        #serialPort = "COM3"  # 串口
        #baudRate =250000  # 波特率
        self.serialPort=serialPort
        self.baudRate=baudRate
        self.createSer()
        self.d = FrameData(pixStyle, width, 1)
        t = threading.Thread(target=self.thread_autoReCreat)  # 自动连接串口线程
        t.daemon = True
        t.start()
    def createSer(self):
        try:
            self.ser = serial.Serial(self.serialPort, self.baudRate, timeout=0)#!!!!!!!!!!!!!!!!!!!!!!!!!!无阻塞
            self.no_error = True
            print("参数设置:串口=%s ,波特率=%d" % (self.serialPort, self.baudRate))
            self.busy=False
        except :
            self.no_error=False
            print("ERROE:参数设置:串口=%s ,波特率=%d" % (self.serialPort, self.baudRate))
    def thread_autoReCreat(self):
        while 1:
            if (not self.no_error):
                print("serail err relinking..")
                try:
                    self.createSer()
                except:
                    pass
            else:
                pass
            time.sleep(1)
    def serialSendData(self,dat):
        datlen = len(dat)
        packstyle = str( datlen) + 'B'  # B 0-255
        req = struct.pack(packstyle, *dat)
        if hasattr(self, 'ser'):
            try:
                self.ser.write(req)
            except serial.serialutil.SerialException:
                self.no_error=False
    def serialSend(self):
        if not self.busy:
            if hasattr(self, 'ser'):
                #print("serialSend")
                try:
                    self.busy = True
                    self.ser.write(self.d.packBytes())
                    self.busy = False
                    #print( self.ser.readline())#read会阻塞
                except serial.serialutil.SerialException:
                    self.no_error=False

    def testCreateDataToSend(self):
        #print("init", d.buf)
        #serialSendData(d.buf)
        slp=1
        self.d.setDataToOn()
        print("on", self.d.buf)
        self.serialSendData(self.d.buf)
        time.sleep(slp)
        self.d.setDataToRGBW(255)
        print("r", self.d.buf)
        self.serialSendData(self.d.buf)
        time.sleep(slp)
        self.d.setDataToRGBW(0, 255)
        print("g", self.d.buf)
        self.serialSendData(self.d.buf)
        time.sleep(slp)
        self.d.setDataToRGBW(0, 0, 255)
        print("b", self.d.buf)
        self.serialSendData(self.d.buf)
        time.sleep(slp)
        #d.setDataToRGBW(0, 0, 0, 255)
        #print("w", d.buf)
        #serialSendData(d.buf)
        #d.setDataToRGBW(255, 255, 255, 255)
        #print("rgbw", d.buf)
        #serialSendData(d.buf)
    def thread_ssend(self):
        # 收发数据
        c=0
        while 1:

            print(c)
            self.testCreateDataToSend()

            if(not self.no_error):
                print("serail err relinking..")
                try:
                    self.createSer()
                except:
                    pass
                time.sleep(1)
            if c>9999:
                c=0
    def thread_srecv(self):
        while 1:
            print("recv:\n")
            print(self.ser.readline())  # 可以接收中文




if __name__ == "__main__":
    def main():
        # client socket
        sop = SerialOP("COM3", 250000, 0x13, 45)
        # 分别启动听和说线程
        # t = threading.Thread(target=sop.thread_ssend)  # 注意当元组中只有一个元素的时候需要这样写, 否则会被认为是其原来的类型
        # t.daemon=True
        # t.start()

        # t1 = threading.Thread(target=sop.thread_srecv)
        # t1.daemon=True
        # t1.start()
        import time

        while 1:
            sop.testCreateDataToSend()
            time.sleep(1)
    #main()
    sconfig=["COM21", 250000, 0x13,45,"COM210", 250000, 0x13, 45]#
    smng=SerialsMng(sconfig)
    while 1:
        #print(smng.ser_arr[0])
        #smng.setdata(0, [0xff, 0, 0, 0xff, 0, 0, 0xff, 0, 0])

        smng.setdataAndsend(0, [0xff, 0, 0, 0xff, 0, 0])
        time.sleep(1)
        smng.setdataAndsend(0, [0,0xff,  0,  0, 0xff,0])
        time.sleep(1)
        smng.setdataAndsend(0, [0, 0,0xff,  0, 0,0xff])
        time.sleep(1)
        smng.setdataAndsend(0, [0xff, 0xff, 0xff, 0xff, 0xff, 0xff])#'''
        time.sleep(1)
        print('123')
    #ser.close()

引用的文件详见前文

https://blog.csdn.net/qq_38288618/article/details/87562026

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值