Forum: PC-Programmierung Arduino + Perl + Windows


von HelloWorldArduino (Gast)


Lesenswert?

Guten Tag,

ich habe ein Problem mit meiner Perl Ansteuerung für mein Arduino unter 
Windows 7 64-Bit. Ich hoffe es findet sich ein Perl-Kenner.


Arduino Code:
Bei Empfangen einer "1" oder "0" soll sich der H/L Zustand des PIN11 
ändern. Über den Serielen Monitor klappt alles.
1
#define ledPin 11
2
int incomingByte;      
3
4
void setup() {
5
6
  Serial.begin(9600);
7
  pinMode(ledPin, OUTPUT);
8
}
9
10
void loop() {
11
  if (Serial.available() > 0) {
12
13
    incomingByte = Serial.read();
14
    
15
    if (incomingByte == '1')
16
    {
17
      digitalWrite(ledPin, HIGH);
18
      Serial.println("LED ist eingeschaltet!");
19
    } 
20
21
    if (incomingByte == '0')
22
    {
23
      digitalWrite(ledPin, LOW);
24
      Serial.println("LED ist ausgeschaltet!");
25
    }
26
  }
27
}

Perl Code (Ausschnitt):
Leider passiert beim Senden nichts. Die Tx/Rx LEDs auf der Platine 
blinken kurzzeitig, mehr aber nicht.
Beim Auslesen der Baudrate, databits etc. habe ich keine Probleme.
1
my $ob = Win32::SerialPort->new ('COM3') || die;
2
$ob->write("1");

Ich habe auch schon das Modul FIRMATA getestet gehabt, leider auch ohne 
Erfolg.

Ich hoffe mir kann einer von Euch helfen. Google konnte mir leider NICHT 
helfen.

Gruß.

von Jürgen S. (jurs)


Lesenswert?

HelloWorldArduino schrieb:
> Ich hoffe mir kann einer von Euch helfen. Google konnte mir leider NICHT
> helfen.

Das Problem dürfte mit Deinem Perl an sich nichts zu tun haben, sondern 
eher mit dem automatischen Reset, den ein Arduino-Board immer dann 
ausführt, wenn Du vom PC aus eine serielle Verbindung zum Board 
aufbaust.

Du schreibst nicht, was für ein Board Du verwendest, daher gehe ich mal 
vom UNO aus. Nach einem automatischen Reset läuft zunächst einmal der 
Bootloader auf der Arduino, danach startet der Sketch.

Ich sehe da zwei Möglichkeiten:

1. Den Steuerbefehl verzögert nach Aufbau der seriellen Verbindung 
senden. Also von Deinem Programm aus: COM-Port öffnen, drei Sekunden 
(oder wie lange es braucht) warten, dann das serielle Kommando senden 
(wenn auf dem Board Reset und Bootloader abgefrühstückt sind).

2. Auf dem Arduino-Board den automatischen Reset 
abschalten/deaktivieren.

Zu 2. siehe:
http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

Vorsicht: Solange der automatische Reset deaktiviert ist, kannst Du über 
den Bootloader Programme nur noch mit "manuellem Reset" auf das Board 
hochladen. Oder mit einem ISP-Programmer.

von HelloWorldArduino (Gast)


Lesenswert?

Hallo Jürgen,

danke für Deine Antwort. Leider funktioniert es dennoch nicht.
Wenn ich nun probiere vom Arduino eine while-Schleife auszulesen (Hello 
â 1s) bekomme ich folgenden Fehler:
"Second Read attempted before First is done [...]"

Ich habe zwischen allen Möglichen Abfragen diverse Pausen mit eingelegt. 
Leider ohne Erfolg.
1
while(1)
2
{
3
   $data = $port->lookfor();
4
   if ($data)
5
   {
6
      print "String length:    " . length($data) . "\n";
7
      print "String Received: (" . $data . ")\n";
8
   }
9
   sleep(2);
10
}


Kannst Du möglicherweise damit etwas Anfangen und mir auf die Sprünge 
helfen? Das gleiche geht auch an die Community. :)

Kann es sein das, dass Arduino mit Perl + Win7 - 64 Bit nicht kompatibel 
ist? Im Internet sind nur Codes unter Linux zu finden.

Danke + Gruß

von Bernd K. (prof7bit)


Lesenswert?

Jürgen S. schrieb:
> Ich sehe da zwei Möglichkeiten:
>
> 1. Den Steuerbefehl verzögert nach Aufbau der seriellen Verbindung
> senden. Also von Deinem Programm aus: COM-Port öffnen, drei Sekunden
> (oder wie lange es braucht) warten, dann das serielle Kommando senden
> (wenn auf dem Board Reset und Bootloader abgefrühstückt sind).
>
> 2. Auf dem Arduino-Board den automatischen Reset
> abschalten/deaktivieren.

drei.

3. Unter Windows (leider nicht unter Linux mit dem derzeitigen Treiber 
dort) kann man das DTR Signal komplett deaktivieren, man kann den Port 
so öffnen daß der Arduino keinen Reset ausführt.

von Robert L. (lrlr)


Lesenswert?

>Serial.begin(9600);
 8n1
usw.

irgendwo muss das auf PC Seite auch eingestellt werden, ...

davon steht im deinem Code ja nix..

von HelloWorldArduino (Gast)


Lesenswert?

Robert L. schrieb:
>>Serial.begin(9600);
>  8n1
> usw.
>
> irgendwo muss das auf PC Seite auch eingestellt werden, ...
>
> davon steht im deinem Code ja nix..

Hallo Robert.

Ich wollte meinen Beitrag kurz fassen, daher hatte ich nur einen 
Ausschnitt der Funktion mit eingefügt gehabt. Weiter unten ist der 
komplette Code.

Leider kommme ich absolut nicht weiter. Ich bin am verzweifeln.

1
use strict;
2
use warnings;
3
use Win32::SerialPort;
4
5
my $ob = Win32::SerialPort->new ('COM3') || die;
6
$ob->debug(0);
7
8
my $baud = $ob->baudrate;
9
my $data = $ob->databits;
10
my $parity = $ob->parity;
11
my $stop = $ob->stopbits;
12
my $hshake = $ob->handshake;
13
14
print "Baudrate:        $baud\n"; # just debugging
15
print "Paritaet:        $parity\n";
16
print "Datenbits:       $data\n";
17
print "Stoppbits:       $stop\n";
18
print "Flusssteuerung:  $hshake\n";
19
20
$ob->baudrate(9600)   || die "fail setting baud";
21
$ob->parity($parity)   || die "fail setting parity";
22
$ob->databits($data)   || die "fail setting databits";
23
$ob->stopbits($stop)   || die "fail setting stopbits";
24
$ob->handshake($hshake)  || die "fail setting handshake";
25
$ob->write_settings   || die "no settings"; 
26
$ob->save("COM_3.cfg");
27
28
print "Writting ... "; <STDIN>;
29
$ob->write("1");

Danke + Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.