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

5031

被折叠的 条评论
为什么被折叠?



