从arduino到python的串行通信,不会丢失字符

时间:2017-05-09 00:49:21

标签: python arduino

我有一个arduino用于从传感器收集数据并将数据发送到python程序。不幸的是,在转移过程中,一些角色在大约5%的时间内丢失了。对于我的应用程序,我最终将收集大约每100毫秒(或更好,如果我可以管理它),我需要99.5%+数据完整性。我原本希望能够在收到数据时进行数据处理,但这似乎会使数据丢失更严重。

我将arduino代码设置为发送一个字符串,其中的数据以' a'开头。并以' b'结尾,每个数据字段之间有一个逗号和一个空格。

因为它正在丢弃字符,我最初尝试发送数据两次并编写python代码来修复重复的行,但这仍然在大约1%的数据点中出现问题。

我目前正在尝试的是让python告诉arduino在' a'之间有多少个字符?和' b'。 arduino等待它收到正确的数字然后继续通过延迟并返回数据采集。

在python方面,我目前正在尝试接收代码,计算' a'之间的字符串长度。并且' b',将字符串长度发送到arduino,并在达到预期长度时继续。它有时可行,但并非总是如此。 (由于似乎不重要的原因,我使用用户输入的' z'作为一行结尾,因为arduino似乎没有阅读' \ n&n #39;正确)。

删除了Arduino代码

void loop() {
  outputString = makeOutput(); //code to make the output string
  int outlen = outputString.length();
  int diff = 1;
  while (diff != 0) {
    Serial.println(outputString);
    inputString = "";
    stringComplete = false;
    while (!stringComplete) {
      selectPort();
    } //reads the data from the port
    diff = outlen - inputString.substring(0, 2).toInt();
  }
  CorrectedDelay(); //runs the delay based on the actual time difference
}

剥离了Python代码:

import serial
import sys
import time

def read_data(self):
    count = 0
    temp = self.data_queue
    tempa = temp.find("a")
    tempb = temp.find("b", tempa)
    if tempb-tempa>10:
        sendstr = str(tempb-tempa+1)+"z"
    else:
        sendstr = "10z"
    while True:
        count+=1
        if count>10000: return "Count Error"

        self.port.write(sendstr)

        self.data_queue =  self.port.read_all()

        temp = self.data_queue
        tempa = temp.find("a")
        tempb = temp.find("b", tempa)
        if tempb-tempa>10:
            sendstr = str(tempb-tempa+1)+"z"
        else:
            sendstr = "10z"
        if sendstr == "17z":
            time.sleep(1.0/1000.0)
            self.port.reset_input_buffer()

            return temp[tempa:tempb+1]

如果我将port2设置为它所在的类(目前它只有一些初始化内容和一个函数选择并打开端口),它有时会输出正确的字符串,有时不会:

运行port.read_data()给出输出(3个示例),例如: ' a,+ 0048604832,b' ' B' ' a,+ 0074239532,b'

第一个和第三个是正确的,' b' ISN'吨

如果我只是运行一个循环:     对于范围内(20):       temp.append(port.read_data()) temp的示例输出是:

[' a,+ 0011015216,b',' a,+ 0059960728,b',' a,+ 0069954852,b',' a,+ 0069954852,b',' a,+ 0069954852,b',' a,+ 0069954852,b',' a,+ 0069954852,b&#39 ;,' a,+ 0069954852,b',' a,+ 0069954852,b',' a,+ 0069954852,b',' a, + 0069954852,b',' a,+ 0079949280,b',' a,+ 0079949280,b',' a,+ 0079949280,b', ' a,+ 0079949280,b',' a,+ 0079949280,b',' a,+ 0079949280,b',' a,+ 0079949280 ,b',' a,+ 0079949280,b',' a,+ 0079949280,b']

(即前三个是正确的,接下来的8个只重复第三个,下一个是正确的,其余的重复一个)。

我尝试过打开和关闭Arduino IDE串口监视器的方法。我试过从命令行和SPE shell运行。我正在使用Arduino Uno设置在sparkfun红板上的Virtual Box中运行Ubuntu。

更新

进一步测试(在arduino中延迟1秒)超过1000个点只给出了20个实例,其中仅接收到一次该值。除此之外,重复的最小点数是3次重复,而最大的重复次数重复47次。有28个正确的1s时间间隔(或接近)的实例。 21个实例,间隙约为2s,2个具有3s间隙,8个具有7s间隙。每个较大的间隙似乎对应于更多的重复点。

0 个答案:

没有答案