Welche Kommunikation läuft?Außer der Herstellung der Kommunikation, klappt nichts.
Brauchst du Hilfe, um obigen Code zum Laufen zu bekommen, oder funktioniert der Code und du kommst jetzt nicht weiter?
Hallo zusammen,
seit graumer Zeit versuche ich mein Arduino über Perl anzusteuern, doch leider ohne Erfolg.
Mein aktueller Code sieht wie folgt aus:
Code:use strict; use warnings; use Win32::SerialPort; my $ob = Win32::SerialPort->new ('COM3') || die; $ob->debug(0); my $baud = $ob->baudrate; my $data = $ob->databits; my $parity = $ob->parity; my $stop = $ob->stopbits; my $hshake = $ob->handshake; print "Baudrate: $baud\n"; # just debugging print "Paritaet: $parity\n"; print "Datenbits: $data\n"; print "Stoppbits: $stop\n"; print "Flusssteuerung: $hshake\n"; $ob->baudrate(9600) || die "fail setting baud"; $ob->parity($parity) || die "fail setting parity"; $ob->databits($data) || die "fail setting databits"; $ob->stopbits($stop) || die "fail setting stopbits"; $ob->handshake($hshake) || die "fail setting handshake"; $ob->write_settings || die "no settings"; $ob->save("COM_3.cfg"); print "Writting ... "; <STDIN>; $ob->write("1"); my $result = $ob->input; print "result = $result\n";Außer der Herstellung der Kommunikation, klappt nichts. Mit dem Code habe ich vor, mithilfe von Perl die PINs zu definieren und zu setzen. Natürlich will ich auch die Ausgabe in einen String packen.Code:#define ledPin 11 int incomingByte; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { if (Serial.available() > 0) { incomingByte = Serial.read(); if (incomingByte == '1') { digitalWrite(ledPin, HIGH); Serial.println("LED ist eingeschaltet!"); } if (incomingByte == '0') { digitalWrite(ledPin, LOW); Serial.println("LED ist ausgeschaltet!"); } } } ]
Ich hoffe jemand kann mir helfen oder mir zuverlässige Quellen nennen - bis jetzt habe ich nichts anständiges/vollständiges finden können.
Equipment:
Arduino UNO,
Win7 - 64x,
Stawberry Perl 5.16 - Win32::SerialPort.
Bitte um Rückmeldung!
Gruß.
Welche Kommunikation läuft?Außer der Herstellung der Kommunikation, klappt nichts.
Brauchst du Hilfe, um obigen Code zum Laufen zu bekommen, oder funktioniert der Code und du kommst jetzt nicht weiter?
Nun, ich kann die Baudrate etc. auslesen und auch erfolgreich setzen. Nur beim senden und empfangen von Daten habe ich Probleme. Z.B. mit $Var->write("1"); sende ich eine 1 an das Arduino was eigentlich dazu führen müsste, das mir der jeweilige PIN gesetzt wird und meine LED leuchtet. Außerdem will ich mit $Var->input(); das lesen können was im SerialMonitor ausgegeben wird.
Gruß.
Einstellung des Ports sollten sein:
-kein Handshake
-kein Parity
-1 Stopbit
-8 Databits
(Klappt bei mir in meinem C#-Programm)
Der Port kann imho nicht gleichzeitig vom SerialMonitor und deinem Perlprogramm benutzt werden.
Aus deinem Perl-Quelltext:
$ob->write_settings
Ist das nicht eine Methode? Dann muß es heißen:
$ob->write_settings()
Ok. Hier mein C#-Arduino-Kommunikations-Programm.
-Es ist zugeschitten auf das oben gepostete Arduino-Programm.
-Es ist ein einfaches Konsolenprogramm, das sich den Arduino-Port selbst sucht.
-Im Projektmappenexplorer von Visual-Studio:
- Rechtsklick auf das Projekt im Projektexplorer
- Hinzufügen -> Verweis
- Haken bei System.Management hinzufügen (Framework)
--- Hauptprogramm ---
--- ConnectionManager ---Code:using System; using System.IO.Ports; using System.Linq; using System.Threading; namespace ConnectToArduino { class Program { static void Main(string[] args) { #region --- Start --- ConnectionManager manager = new ConnectionManager(); SerialPort arduinoPort; if (manager.SerialPorts.Count > 0) { arduinoPort = manager.SerialPorts.ElementAt(0).Value; Console.WriteLine("Arduino found: {0}\n", manager.SerialPorts.ElementAt(0).Key); } else { Console.WriteLine("No Arduino found!"); Console.WriteLine("<Press Key to exit program>"); Console.ReadKey(); return; } try { arduinoPort.Open(); } catch (Exception) { Console.WriteLine("Port already open!"); Console.WriteLine("<Press Key to exit program>"); Console.ReadKey(); return; } #endregion #region --- Send and Receive --- arduinoPort.Write("1"); Thread.Sleep(100); Console.WriteLine("Response from Arduino after sending \"1\": {0}", arduinoPort.ReadLine()); Thread.Sleep(1000); arduinoPort.Write("0"); Thread.Sleep(100); Console.WriteLine("Response from Arduino after sending \"0\": {0}", arduinoPort.ReadLine()); Console.WriteLine("<Press Key to exit program>"); Console.ReadKey(); #endregion #region --- End Program --- try { arduinoPort.Close(); } catch (Exception){ return; } #endregion } } }
Code:using System.Collections.Generic; using System.Diagnostics; using System.IO.Ports; using System.Linq; using System.Management; namespace ConnectToArduino { public sealed class ConnectionManager { public Dictionary<string, SerialPort> SerialPorts { get; private set; } public ConnectionManager() { FindArduinoDevices(); } private void FindArduinoDevices() { var dict = new Dictionary<string, SerialPort>(); try { foreach (ManagementObject device in new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_SerialPort").Get()) { if (!device["PNPDeviceID"].ToString().Contains("VID_2341")) continue; var port = new SerialPort(); var config = device.GetRelated("Win32_SerialPortConfiguration") .Cast<ManagementObject>().ToList().FirstOrDefault(); port.PortName = device["DeviceID"].ToString(); port.BaudRate = (config != null) ? int.Parse(config["BaudRate"].ToString()) : int.Parse(device["MaxBaudRate"].ToString()); dict.Add(device["Description"].ToString(), port); } SerialPorts = dict; } catch (ManagementException mex) { Debug.WriteLine(@"An error occurred while querying for WMI data: " + mex.Message); } } } }
Geändert von Sisor (28.09.2014 um 21:38 Uhr)
Hallo,
ist der Thread hier beendet? Ich kenn mich in den Foren noch nicht so gut aus. Ich hätte da vielleicht eine Antwort,
auf jeden Fall aber ein Problem mit dem Arduino und Perl.
Gruß Jürgen
Hallo,
der Thread und auch das Problem besteht noch.
Leider habe ich auch bis jetzt keine Zeit dafür gehabt.
Gruß.
Lesezeichen