Pages: [1]   Go Down
Author Topic: Arduino - Phyton - Problem mit read in Python  (Read 688 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Liebe Arduinogemeinde,

ich habe voller Elan damit begonnen, die LED meines Arduinos über Python zu steuern. Das Ziel ist es, mittels Python einen Wert über den seriellen Port an das Arduino zu senden. Der Wert hat das Format ABB, A steht für LED an (=1) oder aus (=0) und BB für die Zeit in Zehntelssekunden. Hat das Arduino mit diesem Wert die LED zum leuchten oder eben nicht-leuchten gebracht, gibt es ein "r" an den seriellen Port zurück, um dem Pythonscript mitzuteilen, dass es "ready" für den nächsten Befehl ist. Wahrscheinlich verpasst das Python-Script ab und zu dieses r (aus einem mir unbekannten Grund, denn manchmal geht auch alles gut) und die ganze Geschichte bleibt dann hängen.

Was mach ich falsch, oder wie krieg ich das hin?

Arduino-Script:

Code:
int led = 13;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  }


void loop() {
   String empfangenerString = empfangen();
   String anab;
   String dauer;
   char eingabe[4];

   empfangenerString.toCharArray(eingabe,4);
  
   for (int i=0;i<1;i++) {
   anab += char(eingabe[i]);
   }
  
   for (int i=1;i<3;i++) {
   dauer += char(eingabe[i]);
   }
  
   unsigned long dauerform = dauer.toInt() * 100;
  
   if (anab.equals("0")) {
      digitalWrite(led, LOW);
      delay(dauerform);
      Serial.println("r");
      }
      
      
   if (anab.equals("1")) {
      digitalWrite(led, HIGH);
      delay(dauerform);
      Serial.println("r");
      }

   else {
      }
   }

   String empfangen() {
      if(Serial.available()) {
         String inString;
         while(Serial.available()) {
            inString += char(Serial.read());
            delay(10);
            }
         return inString;
         }
      return "";
      }

und das Testscript in Python:

Code:
import serial as s
import time as t

def sandw(output):
ready = 0
port = s.Serial('/dev/tty.usbmodem621', 9600, timeout=0)
port.write(output)
while ready != "r":
ready = port.readline(1)
return

for i in range(5):
sandw("010")
sandw("102")
sandw("010")
sandw("103")
sandw("010")
sandw("101")

Wäre super dankbar für jede Hilfe!
« Last Edit: June 06, 2012, 06:34:12 pm by biitlu » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry that I cannot write it in German, hopefully google translate is good enough.
Look at my comment here for your python script: http://arduino.cc/forum/index.php/topic,110610.msg830909.html#msg830909
Also, Serial.println(1) is actually sending 1\n. So, your python script is reading one byte 'r'. The next time it reads from the serial port, it reads '\', then 'n'. It would be best to do Serial.write(1) or change your python script to readline(). This will continually read till timeout or if it reads \n.
Logged

Pages: [1]   Go Up
Jump to: