我一直在尝试与树莓派3和功率放大器建立串行连接。串行连接工作正常,但是当我不得不从中读取数据时,问题就来了。那是代码:
import serial
import struct
ser = serial.Serial(
port = '/dev/ttyS0',
baudrate = 19200,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS
)
print(ser.isOpen())
#thestring = "7E FF 02 03 04 05 7F"
s = ["0x7E", "0xFF", "0x02", "0x03", "0x04", "0x05", "0x7F"]
b = []
b1 = []
for x in s:
b = [str.encode(x)]
print("Here i am")
for j in b:
b1 = ser.write(j)
print("Here i am1")
##s = ser.read(1)
##print("Eccomi3")
##print(s.decode())
##ser.closed()
while 1:
print("u")
text = ser.read(1)
if text:
print("uu")
n = ser.inWaiting()
if n:
print("uuu")
text = text + ser.read(n)
print("uuuu")
它的工作原理是:我向该设备发送了一个十六进制字符串,并且我必须返回另一个十六进制字符串。我已经将所有这些打印品放置在代码中,以测试其到达的位置。到达
print("u")
然后什么也没有,它永远卡在那里,所以我猜它不会执行ser.read(1)
。在这一点上我不知道该怎么办,任何建议肯定会帮助我。谢谢
答案 0 :(得分:0)
根据您为串行端口设置的配置,您的代码将按预期运行。
当代码卡在serial.read(1)
指令上时,仅表示由于某种原因(也许您的命令是错误的,丢失了终止符,或者您的设置或硬件不正常)您的端口未接收到您正在等待的单个字节,它将一直等待,因为您已指示未定义超时(默认值为None
,这意味着永远等待直到该顽固字节进入,或者如果您希望端口处于阻塞模式)。
您可以更改该行为,只需设置一个超时时间以适应您的耐心需求(对于大多数设备,1或2秒应该绰绰有余)。
您可能要重新考虑的另一件事是,在读取之前,始终用serial.inWaiting()
检查RX缓冲区中是否有数据。
如果您需要诊断端口的帮助,只需在评论中加上设备详细信息即可。您可能要开始检查与minicom等终端的连接。如果您详细说明为什么认为连接有效,可能会有所帮助,因为它似乎无效。
编辑1:我意识到您的代码还有其他问题。您没有将命令上的字符串正确转换为字节。可能有更好的方法,但是要快速解决,只需从s
的字符串中删除0x并将b=[str.enocde(x)]
替换为b+=bytearray.fromhex(x)
编辑2:忘记编辑1,我看到您使用的是Python 3.x,但问题是b = [str.enocde(x)] should be b += [str.enocde(x)]
,否则您仅发送第一个字节。