使用 pyserial 读取 Scale 显示 b''
Using pyserial to read Scale shows b''
我对使用 pyserial 还很陌生,目前我在阅读量表时遇到困难。我相信这与我在 python 上没有正确执行的一些初始化有关。我一直 运行 LabVIEW 的规模,但我试图摆脱它,因为我的知识非常有限。当我执行以下代码时,我打印了 b ' '。如果没有超时,代码将永远继续下去,除非我拔下设备(我也使用了 ser.readline())。如果有帮助,我附上了从 labview 使用的初始化代码(我知道框图上的设置与代码不同,但您可以在前面板上手动更改它们以匹配比例设置)。感谢您提前提供的帮助!
ser = serial.Serial("COM3",
9600,
timeout = 2,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_ODD)
print('Connected')
ser.read(5)
设置
您的电缆应该没问题,因为您可以连接 Scale UART。然后,您必须正确设置连接。根据你的图和一些documentation (p. 55, also see)应该是:
import serial
ser = serial.Serial("COM3",
1200,
timeout = 2,
bytesize=serial.SEVENBITS,
parity=serial.PARITY_ODD,
stopbits=serial.STOPBITS_ONE)
如果您在交流过程中遇到乱码,很可能是上面的设置应该被修复以匹配 Scale 设置。
通讯
UART没有字符可读,超时。设备很可能在 poll 模式或 streams 字符下工作在 read
调用期间未满足的特定条件下。
手册说(第 65 页):
The print command can be transmitted by a software command or by
pressing .
投票
在第一种情况下(轮询模式),您必须在读回任何信息之前发送命令(由协议定义)。 manual(第 53-63 页)增加了一些关于用于交换信息的协议的说明。例如。如果我们想轮询比例模型:
ser.write(b"\x1bx1_\r\n") # Send data, stands for: ESC x 1 _ CR LF (p. 62)
rep = ser.read(64) # Try to read up to 64 bytes
要从 Scale 读取数据,请使用:
ser.write(b"\x1bP\r\n") # Equivalent to press button
# (block auto print, see p. 61)
rep = ser.read(ser.in_waiting) # Read pending bytes, should returns 16 bytes
# eg.: b"+****72.55*g**\r\n" (p. 57)
流
您可以使用以下方式检查 this 行为:
rep = ser.read_until()
返回前会等待 \n
(换行),启动脚本并按下按钮。您应该会收到体重秤的数据。
如果秤在特定事件(例如:按下按钮)上流式传输数据,那么您需要解决一个完全不同的问题。您需要实现一个监听器,因为您需要持续监听 UART。它通常使用队列完成,主要思想是(为简单起见使用 bytearray
模拟):
q = bytearray()
while True:
# Read until Line Feed:
d = ser.read_until()
# Update queue:
q.extend(d)
# Logic here to consume queue:
# ...
不要在生产中使用最后一个代码片段,它只是一个修正想法的虚拟示例。
如果你使用这个解决方案,你最好实现一个侦听器服务来解决 Producer-Consumer Problem.
轮询和流之间的选择取决于设备功能和您的应用程序要求。
我对使用 pyserial 还很陌生,目前我在阅读量表时遇到困难。我相信这与我在 python 上没有正确执行的一些初始化有关。我一直 运行 LabVIEW 的规模,但我试图摆脱它,因为我的知识非常有限。当我执行以下代码时,我打印了 b ' '。如果没有超时,代码将永远继续下去,除非我拔下设备(我也使用了 ser.readline())。如果有帮助,我附上了从 labview 使用的初始化代码(我知道框图上的设置与代码不同,但您可以在前面板上手动更改它们以匹配比例设置)。感谢您提前提供的帮助!
ser = serial.Serial("COM3",
9600,
timeout = 2,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_ODD)
print('Connected')
ser.read(5)
设置
您的电缆应该没问题,因为您可以连接 Scale UART。然后,您必须正确设置连接。根据你的图和一些documentation (p. 55, also see)应该是:
import serial
ser = serial.Serial("COM3",
1200,
timeout = 2,
bytesize=serial.SEVENBITS,
parity=serial.PARITY_ODD,
stopbits=serial.STOPBITS_ONE)
如果您在交流过程中遇到乱码,很可能是上面的设置应该被修复以匹配 Scale 设置。
通讯
UART没有字符可读,超时。设备很可能在 poll 模式或 streams 字符下工作在 read
调用期间未满足的特定条件下。
手册说(第 65 页):
The print command can be transmitted by a software command or by pressing .
投票
在第一种情况下(轮询模式),您必须在读回任何信息之前发送命令(由协议定义)。 manual(第 53-63 页)增加了一些关于用于交换信息的协议的说明。例如。如果我们想轮询比例模型:
ser.write(b"\x1bx1_\r\n") # Send data, stands for: ESC x 1 _ CR LF (p. 62)
rep = ser.read(64) # Try to read up to 64 bytes
要从 Scale 读取数据,请使用:
ser.write(b"\x1bP\r\n") # Equivalent to press button
# (block auto print, see p. 61)
rep = ser.read(ser.in_waiting) # Read pending bytes, should returns 16 bytes
# eg.: b"+****72.55*g**\r\n" (p. 57)
流
您可以使用以下方式检查 this 行为:
rep = ser.read_until()
返回前会等待 \n
(换行),启动脚本并按下按钮。您应该会收到体重秤的数据。
如果秤在特定事件(例如:按下按钮)上流式传输数据,那么您需要解决一个完全不同的问题。您需要实现一个监听器,因为您需要持续监听 UART。它通常使用队列完成,主要思想是(为简单起见使用 bytearray
模拟):
q = bytearray()
while True:
# Read until Line Feed:
d = ser.read_until()
# Update queue:
q.extend(d)
# Logic here to consume queue:
# ...
不要在生产中使用最后一个代码片段,它只是一个修正想法的虚拟示例。 如果你使用这个解决方案,你最好实现一个侦听器服务来解决 Producer-Consumer Problem.
轮询和流之间的选择取决于设备功能和您的应用程序要求。