我有一个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间隙。每个较大的间隙似乎对应于更多的重复点。