python基于串口通信实现封装

工作中需要用到UBS转串口通过串口给下位机发数据,于是通过查阅,python居然真的有对应的库

这是在百度中收到的,关于pyserial的使用:

在Python中,可以使用pyserial库来进行串口通信。以下是一个简单的例子,展示了如何使用pyserial发送和接收数据。

首先,确保安装了pyserial库:

pip install pyserial

import serial
import time
 
# 打开串口
# 设备文件名可能是 '/dev/ttyUSB0', '/dev/tty.usbserial口1' 或者其他,取决于操作系统和硬件
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=0.5)  # 设置串口号和波特率
 
# 发送数据
ser.write(b'Hello\n')  # 注意必须是字节类型,所以使用b'Hello\n'
 
# 读取数据
# 可以使用ser.inWaiting()来检查是否有数据可读
if ser.inWaiting() > 0:
    response = ser.readline()  # 读取一行,如果知道数据的确切长度,也可以直接读取那么多字节
    print(response)
 
# 关闭串口
ser.close()

基于上述资料,对串口方法进行二次封装:

实现如下:

class Communication():  # 封装串口
    data = ''

    def __init__(self, com, bps, timeout):
        self.port = com
        self.bps = bps
        self.timeout = timeout
        self.is_receiving=False
        try:
            # 打开串口,并得到串口对象
            self.com = serial.Serial(self.port, self.bps, timeout=self.timeout)
            # 判断是否打开成功
            if self.com.is_open:
                ret = True
        except Exception as e:
            logger.error("---打开串口失败,请检查串口连接---:", e)
            exit()
        self.running = True
        self.thread = threading.Thread(target=self.get_data,daemon=False, name='get_data thread')
        self.thread.start()
        logger.info(f'{self.thread.name} start')

    # 打印串口相关数据
    def Print_Name(self):
        print(self.com.port)  # 读或者写端口
        print(self.com.baudrate)  # 波特率
        print(self.com.bytesize)  # 字节大小
        print(self.com.parity)  # 校验位
        print(self.com.stopbits)  # 停止位

    # 打开串口方法
    def Open_Engine(self):
        self.com.open()

    # 关闭串口方法
    def Close_Engine(self):
        self.com.close()
        logger.info(f"串口打开状态{self.com.is_open}")  # 检验串口是否打开

    def hexStr_to_str(self, hex_str):
        '''
         函数名称: hexStr_to_str
         功能描述: 把需要发送的指令转换为str
         输入参数:hex_str
         返回参数:str_bin.decode('utf-8')
         '''
        hex = hex_str.encode()
        str_bin = binascii.unhexlify(hex)
        return str_bin

    def send_data(self, str1):
        '''
        函数名称: send_data
        功能描述: 发送int类型的指令
        输入参数:str
        返回参数:data
        '''
        time.sleep(0.5)
        logger.info('发送数据: {}'.format(str1.hex().upper()))
        data = self.com.write(str1)  # 调用转换方法写入16进制参数\
        return data

代码调用举例:


if __name__ == '__main__':
    b = Communication("COM18", 115200, timeout=1)
    b.send_data(b"\xc0\x00\x00\x10\x00\x11\x00\x00\x00\x00\x01\x02\x01\x08\xa0\x0f\x00\x00\x10'\x00\x00U\x17\xc0")
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值