RFID read EPC(RS232/485转串口)

本文介绍了一个使用Python实现的串口通信类,该类利用多线程技术进行数据读取,确保了数据的实时性和准确性。通过实例演示了如何初始化串口参数,启动读取线程,并正确解析接收到的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import threading
import time
import serial

class ComThread:
    def __init__(self, Port='COM10'):
        self.l_serial = None
        self.alive = False
        self.waitEnd = None
        self.port = Port
        self.ID = None
        self.data = None

    def waiting(self):
        if not self.waitEnd is None:
            self.waitEnd.wait()

    def SetStopEvent(self):
        if not self.waitEnd is None:
            self.waitEnd.set()
        self.alive = False
        self.stop()

    def start(self):
        self.l_serial = serial.Serial()
        self.l_serial.port = self.port
        self.l_serial.baudrate = 57600
        self.l_serial.timeout = 0.01+0
        self.l_serial.open()
        if self.l_serial.isOpen():
            self.waitEnd = threading.Event()
            self.alive = True
            self.thread_read = None
            self.thread_read = threading.Thread(target=self.FirstReader)
            self.thread_read.setDaemon(1)
            self.thread_read.start()
            return True
        else:
            return False

    # def SendDate(self,i_msg,send):
    #     #     lmsg = ''
    #     #     isOK = False
    #     #     if isinstance(i_msg):
    #     #         lmsg = i_msg.encode('gb18030')

    #     #     else:
    #     #         lmsg = i_msg
    #     #     try:
    #     #         # 发送数据到相应的处理组件
    #     #         self.l_serial.write(send)
    #     #     except Exception as ex:
    #     #         pass;
    #     #     return isOK

    def FirstReader(self):
        while self.alive:
            time.sleep(0.01)

            data = ''
            #data = data.encode('utf-8')
            data = data.encode()

            n = self.l_serial.inWaiting()
            if n:
                 data = data + self.l_serial.read(n)
                 print('EPC:', data)
                 print(type(data))

            n = self.l_serial.inWaiting()
            if len(data)>0 and n==0:
                try:
                    temp = data.decode('gb18030')
                    print(type(temp))
                    print(temp)
                    car,temp = str(temp).split("\n",1)
                    print(car,temp)

                    string = str(temp).strip().split(":")[1]
                    str_ID,str_data = str(string).split("*",1)

                    print(str_ID)
                    print(str_data)
                    print(type(str_ID),type(str_data))

                    if str_data[-1]== '*':
                        break
                    else:
                        print(str_data[-1])
                        print('str_data[-1]!=*')
                except:
                    print(" ")

        self.ID = str_ID
        self.data = str_data[0:-1]
        self.waitEnd.set()
        self.alive = False

    def stop(self):
        self.alive = False
        self.thread_read.join()
        if self.l_serial.isOpen():
            self.l_serial.close()
#调用串口,测试串口
def main():
    rt = ComThread()
    rt.sendport = '**1*80*'
    try:
        if  rt.start():
            print(rt.l_serial.name)
            rt.waiting()
            print("The data is:%s,The Id is:%s"%(rt.data,rt.ID))
            rt.stop()
        else:
            pass
    except Exception as se:
        print(str(se))

    if rt.alive:
        rt.stop()

    print('')
    print ('End OK .')
    temp_ID=rt.ID
    temp_data=rt.data
    del rt
    return temp_ID,temp_data


if __name__ == '__main__':

    #设置一个主函数,用来运行窗口,便于若其他地方下需要调用串口是可以直接调用main函数
    ID,data = main()

    print("******")
    print(ID,data)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大江东去浪淘尽千古风流人物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值