如何在 Python 3.x 中的 pyserial readline 中查找字节数据

How to find the byte data in pyserial readline in Python 3.x

如何在串行字节数据中找到以换行符结尾的子串。我只想从 uart 流中提取数据。

无法在 Pyserial 行中找到字节数据。

我可以在第一行找到 imei,但我试过几种方法都找不到第二行?

编辑: 这是一个没有转义序列的错字。

我的 UART 流中的输出:

b'\xfeimei_1234567777777\n'
b'ccid_123123324234234234324\n'

非常感谢任何帮助。

最小代码示例:

IMEI=b'imei_'

CCID=b'ccid_'
ccid = b'ccid_123123324234234234324\n'
XFIND_CCID=b'ccid_12'
OCCID=b'12'

#Here open the serial connection
run = True
while run:
  data=device.readline()
  print(data)

  #It works for this well without any issue.
  if data.find(IMEI) == 1:
      v_imei = data
      print(imei)

  #None of the method works
  #Method 1
  if data.find(CCID) == 1:
      ccid = data
      print(ccid)

  #Method 2
  if data.find(ccid) == 1:
      v_ccid = data
      print("Hurray we found the CCID %s" % v_ccid)

  #Method 3
  if data.find(OCCID) == 1:
      v_ccid = data
      print("OCCID we found the CCID %s" % v_ccid)


  #Method 4
  if data.find(XFIND_CCID) == 1:
      print("XX Hurray we found the CCID")

  if data == "end"
      run = False

对您问题的简短回答是 bytes.find,如 str.find,returns 它找到的第一个匹配字符的起始索引。

第一个比较有效,因为您在索引 0 处有 \xfe,将 imei 确实放在索引 1 处。

剩余的比较不起作用,因为 ccid_ 在第二行的索引 0,而不是索引 1。

如果你想要一个 bool 指示一个 bytes 是否出现在另一个中,而不真正关心索引,请改用 in 运算符,例如:

 if CCID in data:

如果你真的关心索引,你可以检查 find returns 非负数,因为它 returns -1 如果找不到该项目:

if data.find(CCID) >= 0:

您最后的选择是使用异常处理。如果您想要假设 CCID 必须在您的数据中并且其他任何东西都非常异常,那么这只是一个真正的好方法。 index 方法类似于 find,除了它引发错误而不是返回 -1:

try:
    i = data.index(ccid)
    # ok, index found
except IndexError:
    # not ok