我正在寻找一种改进我的代码并使之在未来可持续发展的方法。
我正在用Arduino获取7种不同的传感器数据,并希望通过蓝牙将数据发送到python。我正在使用Bluno Nano v1.3和HC-05模块连接计算机的蓝牙。我要获取的数据来自惯性测量单元(IMU),总共包含6个数据流,此外,我还从电位计中读取数据。
在Python中,我想在Arduino提供后立即实时绘制数据。稍后,我也想实时分析数据并提供运动反馈。
问题或者我想改善的是Arduino和python之间的时序问题。现在,我在Arduino上有300毫秒的延迟。在python中,我每隔50ms使用“ readline()”来读取来自Arduino的新数据。
如果我更改代码并增加处理数据所需的时间,则python和Arduino之间将出现计时问题,因为数据请求的速度比Arduino提供的数据慢。这会导致数据流中断或接收到的数据和提供的数据发生巨大延迟,我认为这是由于Arduino填充的缓冲区造成的。
我想通过提供Arduino发送的数据流的开头和结尾来同步Arduino和python。我以为我可以使用``ser.write()''将命令从python发送到Arduino,这使Arduino执行数据收集过程并将收集到的数据发送到python。再次,我偶然发现了从Arduino发送来的不完整的数据包。我不确定100%为何会这样继续下去。另外,我不知道这是处理来自Arduino的数据的最有效方法。
'''Arduino
SoftwareSerial mySerial(A2, A3);
mySerial.println(String(gX) + ";" + String(gY) + ";" + String(gZ) + ";" +
String(rX) + ";" + String(rY) + ";" + String(rZ) + ";" + String(pot) +
";" + String(millis()));
Serial.println(String(gX) + ";" + String(gY) + ";" + String(gZ) + ";" +
String(rX) + ";" + String(rY) + ";" + String(rZ) + ";" + String(pot) +
";" +
String(millis()));
delay(300);
Serial.flush();'''
'''python
ser = serial.Serial(port, 9600, timeout=None )
ser.flushInput()
ser.flushOutput()
try:
while(True):
#ser.write(b"Send") #I tried to send this command to Arduino to
exectue the data transmission.
time.sleep(0.05)
b = ser.readline()
print(b)
inData = b.decode()
print(inData)
#If I add the rest of my here it will slow down the data acquisition part
in python, which makes it necessary to increase the delay in Arduino.
每当Arduino发送数据时,我都希望python接收数据并处理它。 Python应该查看数据包何时具有开始和结束,并准确地对该数据包进行处理,然后使用Arduino提供的下一个最新数据包。