对于我的项目,我需要一个Raspberry Pi与几个外围组件进行通信,其中两个是Arduinos . 引起我问题的是Pro Mini 3.3 V ATmega328 . Arduino从两个传感器接收输入,并通过串行传输数据到Raspberry Pi . 在Raspberry上使用带有串行包的Python代码,它每50毫秒 Build 一个连接 .
打印Raspberry的输入时,前几行是正确的,但在大约两,三秒后,打印的行是随机字符 .
我的Python代码如下所示:
import serial
ser = serial.Serial('/dev/ttyS0', 115200, timeout=1)
if ser.isOpen():
ser.close()
ser.open()
...
# loop
try:
ser.write("1")
ser_line = ser.readline()
print ser_line
...
Arduino代码:
#include <Wire.h>
#include "SparkFunHTU21D.h"
#include <FDC1004.h>
FDC1004 fdc(FDC1004_400HZ);
HTU21D myHumidity;
int capdac = 0;
void setup() {
Wire.begin();
Serial.begin(115200);
myHumidity.begin();
}
void loop() {
String dataString = "";
dataString += String(myHumidity.readHumidity());
dataString += " ";
dataString += String(myHumidity.readTemperature());
dataString += " ";
for (uint8_t i = 0; i < 4; i++){
uint8_t measurement = 0;
uint8_t channel = i;
fdc.configureMeasurementSingle(measurement, channel, capdac);
fdc.triggerSingleMeasurement(measurement, FDC1004_400HZ);
//wait for completion
delay(15);
uint16_t value[2];
if (! fdc.readMeasurement(measurement, value)) {
int16_t msb = (int16_t) value[0];
int32_t capacitance = ((int32_t) 457) * ((int32_t) msb);
capacitance /= 1000; //in femtofarads
capacitance += ((int32_t) 3028) * ((int32_t) capdac);
dataString += String(capacitance);
dataString += " ";
int16_t upper_bound = 0x4000;
int16_t lower_bound = -1 * upper_bound;
if (msb > upper_bound) {
if (capdac < FDC1004_CAPDAC_MAX)
capdac++;
} else if (msb < lower_bound && capdac > 0) {
capdac--;
}
}
}
Serial.println(dataString);
delay(20); // delay in between reads for stability
}
此循环的输出如下所示:
因此输出失去准确性并在大约六行之后成为随机字符,输出无法恢复 . 当我在Arduino的串行监视器中打印串行输出时,输出始终保持正确 . 经过几次测试后,我的想法就用完了 . 有没有人解决这个问题或经历过类似的行为?