3

因此,较大项目的一部分需要使用树莓派从串行端口接收一个长的十六进制字符串。我以为我已经完成了所有工作,但后来发现它在字符串中间丢失了一大块数据。

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

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

4

2 回答 2

2

Glad my comment helped!

Set timeout to a low number, e.g. 1 second. Then try something like this. It tries to read a large chunk, but times out quickly and doesn't block for a long time. Whatever has been read is put into a list (rx_buf). Then loop forever, as long as you've got pending bytes to read. The real problem is to 'know' when not to expect any more data.

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.

The reason I'm putting the chunks in a list is that the join operation is much more efficient than '+=' on strings.

于 2013-04-30T19:46:57.130 回答
0

According to this question you need to read the data from the in buffer in chunks (here single byte):

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)

I suspect what is happening in your case is that you're getting an entire 'buffers' full of data, which depending on the state of the buffer may vary.

于 2013-04-30T19:29:29.337 回答