RC3563内阻测试仪数据解析(python)

本文介绍了如何使用Python解析RC3563内阻测试仪产生的数据,通过详细的步骤和代码示例,揭示了从数据获取到处理的全过程,帮助读者理解并应用在实际开发中。

参考: github

import math
import struct
import time
from dataclasses import dataclass

import serial

PACKET_LENGTH = 10


__all__ = [
    "RC3563Reading",
    "RC3563",
]



@dataclass
class RC3563Reading:
    voltage_v: str
    resistance_ohm: str


def parse_packet(pkt: bytes) -> RC3563Reading:
    status_display, r_range_code, r_display_bytes, sign_code, v_range_code, v_display_bytes = struct.unpack('BB3sBB3s', pkt)

    r_display_code = (status_display & 0xF0) >> 4
    v_display_code = (status_display & 0x0F) >> 0

    assert sign_code in (0, 1)
    assert r_range_code in (1, 2, 3, 4, 5, 6)  # 20mΩ, 200mΩ, 2Ω, 20Ω, 200Ω, AUTO
    assert r_display_code in (0x05, 0x06, 0x09, 0x0a)
    assert v_display_code in (0x04, 0x08)  # 20V, 100V

    r_display_value = struct.unpack('I', r_display_bytes + b"\x00")[0] / 10000
    resistance_base = round(r_display_value, 3)

    sign = 1 if sign_code == 1 else -1
    v_display_value = struct.unpack('I', v_display_bytes + b"\x00")[0] / 10000
    voltage = str(round(sign * v_display_value, 3))

    if r_display_code == 0x05:
        r_unit_disp = 'mΩ'
        resistance = str(resistance_base)
    elif r_display_code == 0x06:
        r_unit_disp = 'mΩ'
        resistance = "0L"
    elif r_display_code == 0x09:
        r_unit_disp = 'Ω'
        resistance = str(resistance_base)
    elif r_display_code == 0x0a:
        r_unit_disp = 'Ω'
        resistance = "0L"

    # noinspection PyUnboundLocalVariable
    return RC3563Reading(voltage + " V", resistance + f" {r_unit_disp}")


class RC3563:
    def __init__(self, path: str):
        self.serial = serial.Serial(path, 115200, timeout=1)

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

    def read(self) -> RC3563Reading:
        while True:
            pkt = self.serial.read(PACKET_LENGTH)
            if len(pkt) == 0:
                continue
            if len(pkt) != PACKET_LENGTH:
                self.serial.flushInput()
                continue

            pkt = parse_packet(pkt)
            return pkt


if __name__ == '__main__':
    a = RC3563("COM3")
    while True:
        pkt = a.read()
        print(f"V: {pkt.voltage_v}, R: {pkt.resistance_ohm}")
        time.sleep(0.01)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值