我的Raspberry Pi 3 Model B和多个(4)Arduino Nanos(ATmega328)之间通过USB进行串行通信时遇到了一些问题。 目前我将2-3个DS18B20温度传感器连接到每个Arduino。我希望将剩下的数量增加到每个Arduino 10个。
这就是我使用USB HUB(EasyAcc USB 2.0 7 Ports Hub)的原因。我不知道为什么,但7个端口中只有2个使用RaspberryPi。
Arduino正在从传感器收集数据,直到他询问每个传感器,然后他在串行通信线路上打印必要的数据(每个传感器的具体数据和温度)。
RaspberryPi正在好奇地等待这些数据。当他获得数据时,他正在编辑数据,以便他可以在我的mysql数据库中编写它。 当我只连接一个Arduino或只为一个Arduino执行一个python脚本时,它工作得非常好。
问题开始时,我连接了更多的Arduinos(USB HUB的4 - > 2,Raspberry的2)。
当我这样做时,我使用Shell Skript在后台启动Python程序。几秒钟后,RaspberryPi仍然执行所有4个Python脚本(使用" pidof python"进行检查)。然后(我想当第一个数据到达时)除了一个以外的所有程序都在停止。 在错误日志中写入以下文字: 回溯(最近一次调用最后一次):
File "/var/www/html/arduino0.py", line 19, in <module>
if (ser0.inWaiting() > 3):
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 435, in i$
s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str)
IOError: [Errno 5] Input/output error
我的第一个想法是,Raspberry感到困惑,因为我将每个Serial变量命名为&#34; ser&#34;,所以我将它们更改为ser0-ser3并弹出相同的错误。说实话,我不知道还剩下。
这就是我问你的原因^^我希望有人知道如何解决这个问题。
非常感谢提前!
亲切的问候Ole
Arduino代码:
/* DS18S20 Temperature Sensor Module sample project with 4 Digit 7-Segment
*/
#include <OneWire.h>
int inPin=10; // define D10 as input pin connecting to DS18S20 S pin
OneWire ds(inPin);
int zahler=0;
String senddata = "";
int sensorcount = 3; //number of connected sensors
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract, Fracts;
byte i;
byte present = 0;
byte data[12];
byte addr[8];
String stringadresse;
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1);
delay(9800);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000;
if (SignBit)
{
TReading = (TReading ^ 0xffff) + 1;
}
Tc_100 = (6 * TReading) + TReading / 4;
Whole = Tc_100 / 100;
Fract = Tc_100 % 100;
Fracts = Fract / 10;
if (SignBit)
{
Serial.print("-");
}
for ( i = 0; i < 8 ; i++){
stringadresse = String(addr[i], HEX);
senddata.concat(stringadresse);
if(i!=7){
//Serial.print("-");
}
}
senddata.concat("|");
senddata.concat(Whole);
senddata.concat(".");
if (Fract < 10)
{
senddata.concat("0");
}
zahler++;
senddata.concat(Fract);
if(zahler != sensorcount){
senddata.concat("-");
}
//Serial.print(zahler);
if(zahler == sensorcount){
zahler = 0;
Serial.print(senddata);
senddata = "";
}
}
Python代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import MySQLdb as mdb
import sys
import serial
con = mdb.connect('localhost', 'censored', 'censored', 'history');
ser0 = serial.Serial("/dev/ttyUSB0", 9600) //USB0-USB3 and ser0-ser3
ser0.flushInput() //ser0-ser3 (<--- in the whole code)
ser0.timeout = 1
specificid = [0,0,0,0,0,0,0,0,0,0,0]
svalue = [0,0,0,0,0,0,0,0,0,0,0]
sensorid = [0,0,0,0,0,0,0,0,0,0,0]
while 1:
if (ser0.inWaiting() > 3):
text = ser0.readline()
print "Folgender Text wurde vom Arduino empfangen: {}".format(text)
splittext = text.split("-")
i = 0
print len(splittext)
while i < len(splittext):
splittext[i]=splittext[i].split("|")
specificid[i] = splittext[i][0]
svalue[i] = splittext[i][1]
print "Spezifische Sensorid: {}".format(specificid[i])
print "Temperatur: {}".format(svalue[i])
with con:
cur = con.cursor()
cur.execute("SELECT sensorid FROM sensors WHERE sensorspecificid = %s",(specificid[i]))
sensorid[i] = cur.fetchone()
print "Eine Temperatur von {} wurde für den {}. Sensor in die Datenbank eingetragen".format(svalue[i],sensorid[i][0])
cur.execute("INSERT INTO svalues(sensorid,value) VALUES(%s, %s)",(sensorid[i][0], svalue[i]))
i = i +1
ser0.close()
壳脚本
#!/bin/bash
nohup python arduino0.py parameter > output0.txt 2> output0.txt &
nohup python arduino1.py parameter > output1.txt 2> output1.txt &
nohup python arduino2.py parameter > output2.txt 2> output2.txt &
nohup python arduino3.py parameter > output3.txt 2> output3.txt &