接收到的串行字符串中丢失数据

2024-09-29 23:19:02 发布

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

因此,大型项目的一部分需要使用raspberry pi从串行端口接收一个长的十六进制字符串。我原以为一切正常,但后来发现它在字符串中间丢失了一大块数据。在

def BUTTON_Clicked(self, widget, data= None):

        ser = serial.Serial("/dev/ex_device", 115200, timeout=3)

        RECEIVEDfile = open("RECIEVED.txt", "r+", 0) #unbuffered


        #Commands sent out
        ser.write("*n\r")
        time.sleep(1)
        ser.flush()
        ser.write("*E")
        ser.write("\r")

        #Read back string rx'd
        RECEIVED= ser.read()


        RECEIVED= re.sub(r'[\W_]+', '', RECEIVED) #remove non-alphanumeric characters (caused by noise maybe?)
        RECEIVEDfile.write(re.sub("(.{4})", "\\1\n", RECEIVED, 0, re.DOTALL)) #new line every 4 characters


        RECEIVEDfile.close              
        ser.write("*i\r")
        ser.close

这是用于检索数据的脚本,波特率和串行命令设置正确,脚本作为“unbuffered”(-u)运行,但不会保存完整的字符串。字符串长度约为16384个字符,但仅保存了大约9520个字符(可能有所不同)(无法提供用于分析的字符串)。有人知道我错过了什么吗?为你能给我的任何帮助干杯。在


Tags: 数据字符串re脚本closepiraspberryser
2条回答

很高兴我的评论有帮助!在

将超时设置为较低的数值,例如1秒。那就试试这样吧。它试图读取一个大的块,但超时很快,并且不会长时间阻塞。任何读过的内容都会被放入一个列表(rx_buf)。然后永远循环,只要还有待读取的字节。真正的问题是“知道”什么时候不需要更多的数据。在

rx_buf = [ser.read(16384)] # Try reading a large chunk of data, blocking for timeout secs.
while True: # Loop to read remaining data, to end of receive buffer.
    pending = ser.inWaiting()
    if pending:
         rx_buf.append(ser.read(pending)) # Append read chunks to the list.
    else:
         break

rx_data = ''.join(rx_buf) # Join the chunks, to get a string of serial data.

我把块放在列表中的原因是join操作比字符串上的'+='更有效。在

根据this question,您需要分块(这里是单字节)从缓冲区中读取数据:

out = ''
# Let's wait one second before reading output (let's give device time to answer).
time.sleep(1)
while ser.inWaiting() > 0:
    out += ser.read(1)

我怀疑你的情况是你得到了一个完整的“缓冲区”的数据,这取决于缓冲区的状态。在

相关问题 更多 >

    热门问题