Arduino + Perl + Windows

Gast #3975126
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ß.
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.
Gast
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ß
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.
Gast
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ß

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.