【NOTE】PySerial(Python的串口通信)

PySerial(Python的串口通信)

介绍

安装

conda search pyserial

Loading channels: done
# Name                       Version           Build  Channel
pyserial                         3.4          py27_0  pkgs/main
...
pyserial                         3.5  py39haa95532_0  pkgs/main
conda install pyserial

入门

初始化

    serial.Serial(SerialBase)

    serial.Serial(
            port=test_port,                 #端口号
            baudrate=test_baudrate,         #波特率
            bytesize=serial.EIGHTBITS,      #数据位
            parity=serial.PARITY_NONE,      #奇偶校验位
            stopbits=serial.STOPBITS_ONE,   #停止位
            timeout=None,                   #超时时间
        )

打开串口

    serial.Serial.open(self)

关闭串口

    serial.Serial.close(self)

读取串口数据

    serial.Serial.read(self, size=1):                        #从端口读字节数据,默认1个字节

    serial.Serial.read_all(self)                             #从端口接收全部数据

    serial.Serial.readline(self, __size: int | None = -1)    #读一行数据

    serial.Serial.readlines(self, __hint: int = -1)          #读多行数据

写入串口数据

    serial.Serial.write(self, data)

清除串口缓冲数据

    self.serial.flushInput()  # 清除接收缓冲区数据

    self.serial.flushOutput()  # 中止当前输出并清除发送缓冲区数据

串口自动化发送demo

class Solution(object):

    def __init__(self, yw_serial=None) -> None:
        self.serial = yw_serial
        self.complete_str = None
        self.timeout = 8

    def open_serial(self):
        if self.serial is None:
            return -1
        if not self.serial.isOpen:
            self.serial.open()

    def close_serial(self):
        self.serial.close()

    # 读取串口数据
    def read_serial(self, complete_str='\r\nOK\r\n') -> str:

        start_time = time.time()
        end_time = time.time()

        self.complete_str = complete_str
        all_data = bytearray()
        is_completed = False

        while True:
            end_time = time.time()
            if end_time - start_time < self.timeout:

                if self.serial.inWaiting() > 0:
                    data = self.serial.read(self.serial.inWaiting())
                    all_data = all_data + data

                if is_completed:
                    break

                if self.complete_str is not None:
                    if re.search(bytes(self.complete_str, encoding="utf8"), all_data) is not None:
                        break
            else:
                break
            time.sleep(0.01)

        all_data = str(all_data, encoding="utf-8")
        return all_data

    # 串口写入数据
    def wirte_serial(self, data):
        self.serial.flushInput()  # 清除接收缓冲区数据
        self.serial.flushOutput()  # 中止当前输出并清除发送缓冲区数据
        self.serial.write(str(data).encode('utf-8'))

    def run(self, cmd):
        self.wirte_serial(cmd)

        while True:
            response = self.read_serial()
            if response is not None:
                break

        return response

    try:
        ser = serial.Serial(
            port=test_port,
            baudrate=test_baudrate,
            bytesize=serial.EIGHTBITS,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE,
            timeout=None,
        )
    except serial.SerialTimeoutException:
        print('打开%s串口超时' % test_port)
        exit(0)
    except serial.SerialException:
        print('串口%s不存在或被占用' % test_port)
        exit(0)
    else:
        print('打开串口%s成功' % test_port)

    sdper = Solution(ser)
    sdper.open_serial()

    for i in range():
    
        response = sdper.run(str(at_cmd) + '\r\n', timeout)
        print(response)

    sdper.close_serial()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_想去旅行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值