如何将来自UART的传入字符添加到字符串中?

2024-06-11 23:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将传入的单个字符加起来形成一个字符串?在

对于exmaple:

来自UART的字符以以下格式打印:

\x02
1
2
3
4
5
6
7
\X03
\x02
a
b
c
d
e
f
g
\x03

我希望输出如下:

^{pr2}$

我已经试过了:

#!/usr/bin/env python
import time
import serial

ser = serial.Serial('/dev/ttyUSB0',38400)
txt = ""

ser.flushInput()
ser.flushOutput()

while 1:
    bytesToRead = ser.inWaiting()
    data_raw = ser.read(1)
    while 1:
        if data_raw !='\x02' or data_raw !='\x03':
            txt += data_raw
        elif data_raw == '\x03':
            break
    print txt

有什么办法吗?我没有得到任何输出使用这个。在


Tags: 字符串importtxtdataraw格式serial字符
2条回答

首先,您不需要调用inWaiting^{}将阻塞直到数据可用,除非您显式设置了读取超时。其次,如果您坚持使用它,请记住函数inWaiting已被属性^{}取代。在

字符串/x03是一个包含所有可打印字符的4个字符的字符串。另一方面,字符串\x03只包含一个ASCII代码为3的不可打印字符。反斜杠是Python字符串中的转义字符。\x后跟两个数字是ASCII字符代码。请使用反斜杠。这就是您看不到输出的直接原因:四个字符的字符串永远不会出现在一个字符的读取中。在

既然不碍事,最重要的是要记住,当你遇到一个终结符字符时,要清空缓冲区。假设您希望使用效率低下的方法就地添加到字符串中。当您到达\x03时,您应该打印txt,并将其重置回'',而不是跳出循环。更好的方法可能是使用^{},这是一个可变序列。请记住,read返回的是字节,而不是python3.x中的字符串。这意味着您应该解码结果,如果您想要文本:txt = txt.decode('ascii')。在

我建议进一步改进,并创建一个无限的生成器函数来将蒸汽分割成字符串。您可以使用该生成器打印字符串或对其执行任何其他操作:

def getstrings(port):
    buf = bytearray()
    while True:
        b = port.read(1)
        if b == b'\x02':
            del buf[:]
        elif b == b'\x03':
            yield buf.decode('ascii')
        else:
            buf.append(b)

for item in getstring(Serial(...)):
    print(item)

我想有一种方法可以帮你一点忙

l = []
while 1:
    data_raw = ser.read(1)
    if data_raw !='/x02' or data_raw !='/x03':
        l.append(data_raw)
    elif data_raw == '/x03':
        txt = "-".join(l)
        print txt

我首先创建一个空列表,每次您收到一个新的原始数据。你把它附加到列表中。一旦到达结束字符,就可以创建字符串并将其打印出来。在

我冒昧地删除了这里的一个循环,为您提供了一个更简单的方法。代码不会在结尾处自行中断(如果需要,只需在打印后添加一个中断)。当您到达结束字符时,它将输出结果,然后等待下一个数据流开始。在

如果您想看到中间结果,您可以打印出每个原始数据,并可以在打印当前加入的列表后立即添加。在

请确保在打开端口时将超时值设置为“无”。这样,您只需等待接收一个位,处理它,然后返回一次读取一个位。在

^{pr2}$

http://pyserial.readthedocs.io/en/latest/pyserial_api.html获取有关mor的信息。在

相关问题 更多 >