Raspberry Arduino 通过 pyserial 的通信在一天后停止
Raspberry Arduino communication via pyserial stops after a day
我通过 USB 连接了一个 Raspberry Pi 和一个 Arduino。 Arduino 通过传感器(EC 和温度传感器)从世界获取数据并将这些数据写入串口。 Raspberry 正在将此数据写入数据库。
Arduino 草图:
#include <OneWire.h>
#include <DallasTemperature.h>
int R1= 500;
int Ra=25; //Resistance of powering Pins
int ECPin= A0;
int ECGround=A1;
int ECPower =A4;
float PPMconversion=0.7;
float TemperatureCoef = 0.019;
float K=2.88;
#define ONE_WIRE_BUS 10 // Data wire For Temp Probe is plugged into pin 10 on the Arduino
const int TempProbePossitive =8; //Temp Probe power connected to pin 9
const int TempProbeNegative=9; //Temp Probe Negative connected to pin 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.
float Temperature=10;
float EC=0;
float EC25 =0;
int ppm =0;
float raw= 0;
float Vin= 5;
float Vdrop= 0;
float Rc= 0;
float buffer=0;
void setup()
{
Serial.begin(9600);
pinMode(TempProbeNegative , OUTPUT ); //seting ground pin as output for tmp probe
digitalWrite(TempProbeNegative , LOW );//Seting it to ground so it can sink current
pinMode(TempProbePossitive , OUTPUT );//ditto but for positive
digitalWrite(TempProbePossitive , HIGH );
pinMode(ECPin,INPUT);
pinMode(ECPower,OUTPUT);//Setting pin for sourcing current
pinMode(ECGround,OUTPUT);//setting pin for sinking current
digitalWrite(ECGround,LOW);//We can leave the ground connected permanantly
delay(100);// gives sensor time to settle
sensors.begin();
delay(100);
R1=(R1+Ra);// Taking into acount Powering Pin Resitance
};
void loop()
{
GetEC();
PrintReadings(); // Cals Print routine [below main loop]
delay(20000);
}
void GetEC(){
sensors.requestTemperatures();// Send the command to get temperatures
Temperature=sensors.getTempCByIndex(0); //Stores Value in Variable
digitalWrite(ECPower,HIGH);
raw= analogRead(ECPin);
raw= analogRead(ECPin);// This is not a mistake, First reading will be low beause if charged a capacitor
digitalWrite(ECPower,LOW);
Vdrop= (Vin*raw)/1024.0;
Rc=(Vdrop*R1)/(Vin-Vdrop);
Rc=Rc-Ra; //acounting for Digital Pin Resitance
EC = 1000/(Rc*K);
EC25 = EC/ (1+ TemperatureCoef*(Temperature-25.0));
ppm=(EC25)*(PPMconversion*1000);
}
void PrintReadings(){
Serial.print("Rc: ");
Serial.print(Rc);
Serial.print(" EC: ");
Serial.print(EC25);
Serial.print(" Simens ");
Serial.print(ppm);
Serial.print(" ppm ");
Serial.print(Temperature);
Serial.println(" *C ");
Serial.print("Vdrop: ");
Serial.println(Vdrop);
Serial.print("Rc: ");
Serial.println(Rc);
Serial.print(EC);
Serial.println("Siemens");
};
Raspberry Pi 上的代码:
import serial
import time
import re
import sqlite3
for com in range(0,4):
try:
PORT = '/dev/ttyACM'+str(com)
BAUD = 9600
board = serial.Serial(PORT,BAUD)
board.close()
break
except:
pass
DEVICE = '/dev/ttyACM'+str(com)
BAUD = 9600
s = serial.Serial(DEVICE, BAUD)
conn=sqlite3.connect('mydatabase.db')
cursor=conn.cursor()
#s.open()
time.sleep(5) # der Arduino resettet nach einer Seriellen Verbindung, daher muss kurz gewartet werden
#s.write("test");
while True:
response = s.readline()
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", response)
if len(numbers) == 4:
temp = numbers[3]
ec = numbers[1]
result = cursor.execute("INSERT INTO sensordata (temp, ec) VALUES ({temp}, {ec})".form$
conn.commit()
print response
数据在 Raspberry 端写入了大约 24 小时,然后我不再从 Arduino 获得串行输出。当我再次重新启动 python 脚本时出现同样的问题。当我重新启动 python 脚本并再次启动串行通信时,Arduino 会重置。我没有更改此默认行为。我仍然没有通过串口获取数据这一事实表明,这不是 Arduino 方面的内存问题。还有一个提示,这一定是 Raspberry 的问题,我是否从重新启动 Raspberry 解决了问题并且数据又记录了 24 小时的事实中得到了。
有没有人好奇地给我提示,如何建立稳固的沟通?
我的问题解决了。
当我在 Arduino 端添加大量串行打印时,我发现在 Raspberry 端并没有真正收到任何东西,而是更少,所以我的 python 程序无法解析 Arduino 草图的内容正在发送。另一个观察结果是:
当我用
看串口设备的时候
screen /dev/ttyACM0
我得到了非常相似的效果并且可以重现该问题。由于我在 Arduino 端添加了大量调试打印,我看到一些通过 pyserial 接收到的字符,我的 python 脚本正在打印,但此屏幕命令严重损害了通信。通过屏幕观看串行设备,我看到了更多的字符,就好像屏幕偷走了节目一样。这是一团糟,我没有设法清理,我不得不重新启动 Raspberry。但是告诉我肯定是树莓派的问题
解决我的问题的是尝试这种通信模式:
https://github.com/gskielian/Arduino-DataLogging/blob/master/PySerial/README.md
完全不懂作者的意思'HOWEVER, be careful that the Arduino is not constantly sending data to your program -- you will likely encounter errors from the buffer overfilling.'
现在要求 Arduino 提供数据并响应,而不是连续发送。
这对我来说仍然很神秘,但我的问题得到了解答,Raspberry 现在成功接收了 6 天的传感器数据。
我通过 USB 连接了一个 Raspberry Pi 和一个 Arduino。 Arduino 通过传感器(EC 和温度传感器)从世界获取数据并将这些数据写入串口。 Raspberry 正在将此数据写入数据库。
Arduino 草图:
#include <OneWire.h>
#include <DallasTemperature.h>
int R1= 500;
int Ra=25; //Resistance of powering Pins
int ECPin= A0;
int ECGround=A1;
int ECPower =A4;
float PPMconversion=0.7;
float TemperatureCoef = 0.019;
float K=2.88;
#define ONE_WIRE_BUS 10 // Data wire For Temp Probe is plugged into pin 10 on the Arduino
const int TempProbePossitive =8; //Temp Probe power connected to pin 9
const int TempProbeNegative=9; //Temp Probe Negative connected to pin 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.
float Temperature=10;
float EC=0;
float EC25 =0;
int ppm =0;
float raw= 0;
float Vin= 5;
float Vdrop= 0;
float Rc= 0;
float buffer=0;
void setup()
{
Serial.begin(9600);
pinMode(TempProbeNegative , OUTPUT ); //seting ground pin as output for tmp probe
digitalWrite(TempProbeNegative , LOW );//Seting it to ground so it can sink current
pinMode(TempProbePossitive , OUTPUT );//ditto but for positive
digitalWrite(TempProbePossitive , HIGH );
pinMode(ECPin,INPUT);
pinMode(ECPower,OUTPUT);//Setting pin for sourcing current
pinMode(ECGround,OUTPUT);//setting pin for sinking current
digitalWrite(ECGround,LOW);//We can leave the ground connected permanantly
delay(100);// gives sensor time to settle
sensors.begin();
delay(100);
R1=(R1+Ra);// Taking into acount Powering Pin Resitance
};
void loop()
{
GetEC();
PrintReadings(); // Cals Print routine [below main loop]
delay(20000);
}
void GetEC(){
sensors.requestTemperatures();// Send the command to get temperatures
Temperature=sensors.getTempCByIndex(0); //Stores Value in Variable
digitalWrite(ECPower,HIGH);
raw= analogRead(ECPin);
raw= analogRead(ECPin);// This is not a mistake, First reading will be low beause if charged a capacitor
digitalWrite(ECPower,LOW);
Vdrop= (Vin*raw)/1024.0;
Rc=(Vdrop*R1)/(Vin-Vdrop);
Rc=Rc-Ra; //acounting for Digital Pin Resitance
EC = 1000/(Rc*K);
EC25 = EC/ (1+ TemperatureCoef*(Temperature-25.0));
ppm=(EC25)*(PPMconversion*1000);
}
void PrintReadings(){
Serial.print("Rc: ");
Serial.print(Rc);
Serial.print(" EC: ");
Serial.print(EC25);
Serial.print(" Simens ");
Serial.print(ppm);
Serial.print(" ppm ");
Serial.print(Temperature);
Serial.println(" *C ");
Serial.print("Vdrop: ");
Serial.println(Vdrop);
Serial.print("Rc: ");
Serial.println(Rc);
Serial.print(EC);
Serial.println("Siemens");
};
Raspberry Pi 上的代码:
import serial
import time
import re
import sqlite3
for com in range(0,4):
try:
PORT = '/dev/ttyACM'+str(com)
BAUD = 9600
board = serial.Serial(PORT,BAUD)
board.close()
break
except:
pass
DEVICE = '/dev/ttyACM'+str(com)
BAUD = 9600
s = serial.Serial(DEVICE, BAUD)
conn=sqlite3.connect('mydatabase.db')
cursor=conn.cursor()
#s.open()
time.sleep(5) # der Arduino resettet nach einer Seriellen Verbindung, daher muss kurz gewartet werden
#s.write("test");
while True:
response = s.readline()
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", response)
if len(numbers) == 4:
temp = numbers[3]
ec = numbers[1]
result = cursor.execute("INSERT INTO sensordata (temp, ec) VALUES ({temp}, {ec})".form$
conn.commit()
print response
数据在 Raspberry 端写入了大约 24 小时,然后我不再从 Arduino 获得串行输出。当我再次重新启动 python 脚本时出现同样的问题。当我重新启动 python 脚本并再次启动串行通信时,Arduino 会重置。我没有更改此默认行为。我仍然没有通过串口获取数据这一事实表明,这不是 Arduino 方面的内存问题。还有一个提示,这一定是 Raspberry 的问题,我是否从重新启动 Raspberry 解决了问题并且数据又记录了 24 小时的事实中得到了。
有没有人好奇地给我提示,如何建立稳固的沟通?
我的问题解决了。
当我在 Arduino 端添加大量串行打印时,我发现在 Raspberry 端并没有真正收到任何东西,而是更少,所以我的 python 程序无法解析 Arduino 草图的内容正在发送。另一个观察结果是:
当我用
看串口设备的时候screen /dev/ttyACM0
我得到了非常相似的效果并且可以重现该问题。由于我在 Arduino 端添加了大量调试打印,我看到一些通过 pyserial 接收到的字符,我的 python 脚本正在打印,但此屏幕命令严重损害了通信。通过屏幕观看串行设备,我看到了更多的字符,就好像屏幕偷走了节目一样。这是一团糟,我没有设法清理,我不得不重新启动 Raspberry。但是告诉我肯定是树莓派的问题
解决我的问题的是尝试这种通信模式:
https://github.com/gskielian/Arduino-DataLogging/blob/master/PySerial/README.md
完全不懂作者的意思'HOWEVER, be careful that the Arduino is not constantly sending data to your program -- you will likely encounter errors from the buffer overfilling.'
现在要求 Arduino 提供数据并响应,而不是连续发送。
这对我来说仍然很神秘,但我的问题得到了解答,Raspberry 现在成功接收了 6 天的传感器数据。