ser.read()不返回任何内容

时间:2019-11-22 09:13:04

标签: python-3.x serial-port raspberry-pi3

我一直在尝试与树莓派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)。在这一点上我不知道该怎么办,任何建议肯定会帮助我。谢谢

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)],否则您仅发送第一个字节。