Arduino和RaspberryPI之间的USB多串口通信

时间:2017-01-14 16:59:11

标签: python mysql linux arduino serial-communication

我的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 &

0 个答案:

没有答案