【发布时间】:2019-07-08 17:43:19
【问题描述】:
我正在使用树莓派 3 和此代码向设备发送请求并接收来自的响应。
#!/usr/bin/python3.7
import socket # Import socket module
import thread
import time
import serial
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=115200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
input = '5A03010d0a75'
print "Sending request... "+input
ser.write(input.decode("hex"))
print "Request sent."
output=""
while True:
output += ser.read(1)
#time.sleep(0.1)
print "Reading... "+output.encode('hex')
它处理响应但缺少字节,它应该接收一个 56 字节长度的字符串而不是 53。
a5030119010000010001000a20120118180130090100020505030117501701051421000301040120010516039833630004060104c200007d
缺少 3 个字节
串行配置是制造商在文档中所说的。 此设备与我在 Delphi 中制作的其他应用程序配合得很好。
额外 这是我的 delphi 应用程序和这个 py 脚本的比较:
Delphi app
A5030119010000010001000A20120118180130090100020505030117501701051421000301040120010516039833630004060104C200007D
Python script
a503011901000001000100 1201181801300901000205050301175017010514210003010401 010516039833630004060104c200007d
【问题讨论】:
-
如果您一次读取缓冲区中的所有内容而不是 1 个字节(从
serial.read(1)中删除 1)会发生什么?那么在你的端口实例化中设置一个超时呢? -
我最好的猜测是您的打印速度减慢了循环速度,足以填充缓冲区,并且在某些迭代中它会溢出并丢弃数据。您是否尝试过仅在循环结束时打印?
-
第一个想法,相同的输出,第二个想法使用
while ser.inWaiting() > 0:并打印出循环,结果相同 -
另外,更新到 py 3.7
-
您的 Delphi 代码是否使用了某种流控制?你用的是什么驱动程序?你知道它的缓冲区大小吗?
标签: python linux serial-port raspberry-pi3