DM3058串口读取数据功能
01 DM3058编程控制
一、前言
今天到货的 DM3058 数字万用表, 下面准备通过它的 RS232 串口读取其测量数据。 串口管脚是主机配置。 需要通过交叉串口线与计算机的 RS232串口相连。
二、测试结果
在 Python 下编程, 打开对应的串口, 波特率设置为9600 , 与示波器内部设置的波特率保持一致。 发送查询字符串。 后面通过回车、换行 操作符结束。 等待DM3058串口返回数据。 读取返回的数据, 并将其转换成 浮点数据。 这是读取直流电压测量命令, 读取交流电压数据命令, 读取电阻测量命令。 发送不同测量命令, DM3058会自动转换测量档位和量程。
QAR10是一款程控电阻箱, 下面就使用DM3058测量它对应的电阻值。 通过程序自动改变QR10 阻值, 然后通过 DM3058读取对应的数据。
QR10通过USB与电脑相连。 通过Python 编程, 逐步从 1欧姆到 10k 欧姆设定电阻箱, 分别读取DM3058测量电阻值。 这是设置电阻值与测量数值之间的误差。 可以看到在整个设定范围内, 误差都在 1 欧姆到2欧姆之间。 整体上看不出他们有区别。 绘制出误差曲线, 才能够比较清楚。 前面这部分显示, 测量线路应该有一个大约 1 欧姆的系统误差。 随着设定超过 2k 欧姆之后, 误差逐步增加。
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY -- by Dr. ZhuoQing 2023-11-22
#
# Note:
#============================================================
from headm import *
import serial
from _ast import Or
from serial.serialutil import SerialException
#------------------------------------------------------------
dm3058 = serial.Serial()
dm3058.baudrate = 115200
dm3058.timeout = 0.05
try:
dm3058.port = 'COM5'
except:
printf('Set dm3058 port COM5 error. ')
try:
dm3058.open()
except serial.serialutil.SerialException:
printf('Open dm3058 port COM5 error.')
else:
printf('Open dm3058 port COM5 Ok.')
#------------------------------------------------------------
#------------------------------------------------------------
def dm3058query(cmd):
dm3058.write(bytes(':%s?\r\n'%cmd, 'gbk'))
for i in range(200):
time.sleep(0.01)
if dm3058.inWaiting() > 0: break
time.sleep(.02)
return eval(dm3058.read(dm3058.inWaiting()))
def dm3058dc():
return dm3058query('MEAS:VOLT:DC')
def dm3058ac():
return dm3058query('MEAS:VOLT:AC')
def dm3058res():
return dm3058query('MEAS:RES')
#------------------------------------------------------------
QR10_HOST = '192.168.0.127'
QR10_PORT = 2244
QR10_BUFSIZE = 0x4000
qr10socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
qr10socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, QR10_BUFSIZE)
qr10socket.settimeout(0.2)
def QR10udpsend(data):
ADDR = (QR10_HOST, QR10_PORT)
if type(data) != str:
data = str(data)
data = bytes(data, 'gbk')
qr10socket.sendto(data, ADDR)
def QR10(res):
QR10udpsend('SENDC AT+USER.SP=%.2f\r'%res)
#------------------------------------------------------------
setr = linspace(1, 10000, 100)
mesr = []
for r in setr:
QR10(r)
time.sleep(1)
rr = dm3058res()
printff(r, rr)
mesr.append(rr)
tspsave('meas', setr=setr, mesr=mesr)
plt.plot(setr, mesr, lw=3)
plt.xlabel("Set(omega)")
plt.ylabel("Measure(omega)")
plt.grid(True)
plt.tight_layout()
plt.show()
printf('\a')
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#============================================================
▲ 图1.2.1 设置与测量数值
▲ 图1.2.2 设置与测量电阻误差

setr=[1.00,102.00,203.00,304.00,405.00,506.00,607.00,708.00,809.00,910.00,1011.00,1112.00,1213.00,1314.00,1415.00,1516.00,1617.00,1718.00,1819.00,1920.00,2021.00,2122.00,2223.00,2324.00,2425.00,2526.00,2627.00,2728.00,2829.00,2930.00,3031.00,3132.00,3233.00,3334.00,3435.00,3536.00,3637.00,3738.00,3839.00,3940.00,4041.00,4142.00,4243.00,4344.00,4445.00,4546.00,4647.00,4748.00,4849.00,4950.00,5051.00,5152.00,5253.00,5354.00,5455.00,5556.00,5657.00,5758.00,5859.00,5960.00,6061.00,6162.00,6263.00,6364.00,6465.00,6566.00,6667.00,6768.00,6869.00,6970.00,7071.00,7172.00,7273.00,7374.00,7475.00,7576.00,7677.00,7778.00,7879.00,7980.00,8081.00,8182.00,8283.00,8384.00,8485.00,8586.00,8687.00,8788.00,8889.00,8990.00,9091.00,9192.00,9293.00,9394.00,9495.00,9596.00,9697.00,9798.00,9899.00,10000.00]
mesr=[2.22,103.01,204.06,305.10,406.09,507.05,608.06,709.04,810.04,910.97,1012.00,1113.04,1214.03,1314.98,1416.03,1517.05,1618.07,1719.10,1820.09,1921.08,2021.95,2122.95,2223.96,2324.96,2426.32,2527.43,2628.45,2729.45,2830.33,2931.34,3032.40,3133.41,3234.43,3335.43,3436.46,3537.45,3638.47,3739.48,3840.49,3941.45,4042.47,4143.51,4244.54,4345.43,4446.42,4547.45,4648.52,4749.54,4850.55,4951.59,5052.59,5153.60,5254.60,5355.62,5456.71,5557.71,5658.63,5759.65,5860.66,5961.64,6062.47,6163.48,6264.51,6365.53,6466.54,6567.53,6668.44,6769.47,6870.51,6971.53,7072.61,7173.60,7274.49,7375.49,7476.51,7577.70,7678.65,7779.61,7880.61,7981.66,8082.66,8183.67,8284.73,8385.69,8486.73,8587.72,8688.79,8789.77,8890.83,8991.86,9092.83,9193.89,9294.82,9395.83,9496.94,9597.85,9698.87,9799.87,9900.91,10002.01]
三、频率范围
使用 DG1062产生不同频率的正弦波, 从 1000Hz 到 1MHz。 使用DM3058测量不同频率下对应的交流电压值。 通过测量结果来看, 出现一个突变, 不知道什么原因。 对应同样的低频数值, 是在 250kHz 之内。 这说明在 250kHz之内, DM3058测量的数值都大体相同。 测量数值降低 0.1V, 对应 400KHz。 在 1MHz 的时候, 电压降低了大约 0.45V。
▲ 图1.3.1 不同频率对应的测量电压

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST4.PY -- by Dr. ZhuoQing 2023-11-22
#
# Note:
#============================================================
from headm import *
from tsmodule.tsvisa import *
import serial
from _ast import Or
from serial.serialutil import SerialException
#------------------------------------------------------------
dm3058 = serial.Serial()
dm3058.baudrate = 115200
dm3058.timeout = 0.05
try:
dm3058.port = 'COM5'
except:
printf('Set dm3058 port COM5 error. ')
try:
dm3058.open()
except serial.serialutil.SerialException:
printf('Open dm3058 port COM5 error.')
else:
printf('Open dm3058 port COM5 Ok.')
#------------------------------------------------------------
#------------------------------------------------------------
def dm3058query(cmd):
dm3058.write(bytes(':%s?\r\n'%cmd, 'gbk'))
for i in range(200):
time.sleep(0.01)
if dm3058.inWaiting() > 0: break
time.sleep(.02)
return eval(dm3058.read(dm3058.inWaiting()))
def dm3058dc():
return dm3058query('MEAS:VOLT:DC')
def dm3058ac():
return dm3058query('MEAS:VOLT:AC')
def dm3058res():
return dm3058query('MEAS:RES')
#------------------------------------------------------------
dg1062open(7)
fdim = linspace(100, 1e6, 100)
vdim = []
for f in fdim:
dg1062freq(1, f)
time.sleep(1)
v = dm3058ac()
printff(f, v)
vdim.append(v)
tspsave('measure', fdim=fdim, vdim=vdim)
plt.plot(fdim, vdim, lw=3)
plt.xlabel("Frequency(Hz)")
plt.ylabel("Voltage(V)")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST4.PY
#============================================================
fdim=[100.00,10200.00,20300.00,30400.00,40500.00,50600.00,60700.00,70800.00,80900.00,91000.00,101100.00,111200.00,121300.00,131400.00,141500.00,151600.00,161700.00,171800.00,181900.00,192000.00,202100.00,212200.00,222300.00,232400.00,242500.00,252600.00,262700.00,272800.00,282900.00,293000.00,303100.00,313200.00,323300.00,333400.00,343500.00,353600.00,363700.00,373800.00,383900.00,394000.00,404100.00,414200.00,424300.00,434400.00,444500.00,454600.00,464700.00,474800.00,484900.00,495000.00,505100.00,515200.00,525300.00,535400.00,545500.00,555600.00,565700.00,575800.00,585900.00,596000.00,606100.00,616200.00,626300.00,636400.00,646500.00,656600.00,666700.00,676800.00,686900.00,697000.00,707100.00,717200.00,727300.00,737400.00,747500.00,757600.00,767700.00,777800.00,787900.00,798000.00,808100.00,818200.00,828300.00,838400.00,848500.00,858600.00,868700.00,878800.00,888900.00,899000.00,909100.00,919200.00,929300.00,939400.00,949500.00,959600.00,969700.00,979800.00,989900.00,1000000.00]
vdim=[1.77,1.77,1.77,1.77,1.77,1.77,1.77,1.77,1.77,1.77,1.80,1.80,1.80,1.79,1.79,1.79,1.79,1.78,1.78,1.78,1.78,1.77,1.77,1.77,1.77,1.76,1.76,1.76,1.75,1.75,1.74,1.74,1.73,1.73,1.72,1.72,1.71,1.71,1.70,1.70,1.69,1.69,1.68,1.67,1.67,1.66,1.65,1.65,1.64,1.63,1.62,1.62,1.61,1.60,1.59,1.59,1.58,1.57,1.56,1.56,1.55,1.54,1.53,1.52,1.52,1.51,1.50,1.49,1.48,1.48,1.47,1.46,1.45,1.44,1.43,1.43,1.42,1.41,1.40,1.39,1.39,1.38,1.37,1.36,1.35,1.35,1.34,1.33,1.32,1.31,1.31,1.30,1.29,1.28,1.27,1.27,1.26,1.25,1.24,1.24]
※ 总 结 ※
本文测试了数字万用表 DM3058串口编程的功能。 通过串口可以读取测量的数值, 改变测量的档位。 测试了编程电阻箱的设置误差, 大约在2欧姆左右, 使用 DG1062测量了 DM3058的交流频率特性。
■ 相关文献链接:
● 相关图表链接: