RS232 Befehl unter Linux

Gast #5149570
Lesenswert?

Hallo,
da ich keine Ahnung von Programmierung habe und es (nach 3 Monaten 
erfolglosen Eigenrecherchen) dank eurer Hilfe innerhalb eines Tages 
geschafft habe meinen Projektor über eine Batch datei zu starten bitte 
ich euch hier nochmal um Hilfe.

A)Ich habe einen PC mit Win 10 per ConLine-V24-XXL-S Serial LAN Device 
Server Netzwerkadapter an meinen Beamer angeschlossen (Virtual COM1).

B) Ich habe ein Odroid C2 mit Linux per ConLine-V24-XXL-S Serial LAN 
Device Server Netzwerkadapter an meinen Beamer angeschlossen (Virtual 
COM1)


Die batch Datei sieht also so aus:
@echo off
mode com1: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off xon=off odsr=off 
octs=off dtr=off rts=off idsr=off
type C:\Beamer\beamer_On.hex > COM1

in der beamer_On.hex steht: PON (STXPONETX)

Das funktioniert mit Windows 10 super.

Im Zuge meiner Automatisierung müsste ich diesen Befehl aber über den 
Odroid und nicht den PC senden. Ich habe gelesen das ich dazu eine bash 
Datei benötige, weil die Batch Datei nicht auf Linux ausführbar ist?

Aber wie hat diese auszusehen? Ich kann wahrscheinlich nicht den Inhalt 
der Batch einfach unter .sh abspeichern oder?
Habe auch schon diverse Recherchen angestellt aber werde aus diesen 
dingern einfach nicht schlau.

Sorry für die Unwissenheit aber vielleicht könnt ihr mich ja aufklären.

Danke schon mal im Voraus.
Gast #5149589
Lesenswert?

Moin,

1
#!/bin/sh
2

3
stty -F /dev/ttyUSB1 9600 raw -echo -ixon -ixoff
4

5
cat beamer_On.hex >/dev/ttyUSB1

Nur so als Vorlage. Den seriellen Port must du natürlich anpassen und 
die beamer_On.hex muss im gleichen Verzeichnis wie das Script liegen.

wichtig ist, dass der Benutzer in der Gruppe dialout ist. Sonst gibts 
Probleme.
Beitrag #5149593 wurde von einem Moderator gelöscht.
Moderator #5149682
Lesenswert?

Für Linux scheint es keine Virtual-COM-Software zu geben (zumindest
nicht vom Hersteller des Interfaces). Wenn für das Interface aber
TCPSERVER mit Port 1002 als Emulation für die serielle Schnittstelle
konfiguriert ist, sollte ein einfaches

1
echo -ne '\x02PON\x03' > /dev/tcp/192.168.100.100/1002

zum Senden des Einschaltbefehls genügen. Ggf. musst du in der obigen
Befehlszeile 192.168.100.100 durch die tatsächlich konfigurierte
IP-Adressee des Interfaces ersetzen.

Die Einstellung der RS-232-Parameter wie Baudrate, Datenbits usw. musst
du mittels Telnet direkt auf dem Interface (s. Handbuch) vornehmen. Es
sieht aber so aus, dass 9600,8,N,1 die Defaulteinstellung ist, so dass
du hier nichts ändern musst.
#5149718
Lesenswert?

Unter linux gibt es auch das Tool netcat, dass solche sachen etwas 
vereinfacht.
Es wird mit der Abkürzung nc aufgerufen.

nc name port < dateiname

für das Beispiel von yalu:

nc 192.168.100.100 1002 < beamer_On.hex

(Es muss nicht die IP-Adresse sein, man kann auch den DNS-Namen der 
Geräte nehmen)
Gast #5153500
Lesenswert?

Wahrscheinlich hatte ich wohl einen Fehler in meiner Beschreibung 
gemacht oder einen Denkfehler in der Umsetzung und in der 
Problembeschreibung wie auch immer.

Der PC (Win 10) hat einen virtuellen COM1 und kann per Batch datei den 
Befehl auslösen s.o.

Ich möchte den Befehl aber über den Odroid C2 (Linux) mit einem 
bestimmten Programm absetzen s.o.

Das Programm kann folgende Protokolle, Befehle...(siehe angehängtes 
Bild)

Diese Befehle werden mit einer sogenannten .cvaction Datei ausgelöst.

Da mein Linux MiniPC ja keinen virtuellen Com1 hatte ich mir überlegt 
das es nur 2 Möglichkeiten gibt den Befehl abzusetzen (da ich kein 
Experte bin kann das natürlich falsch sein):

1.Einen Befehl vom Linux MiniPc an den Win PC senden, damit der Win PC 
die Batch datei ausführt und dann den Befehll an COM1 (Beamer)sendet. 
Dies geht aber nicht über das ausführen einer Konsole unter Linux 
sondern über die Commands: siehe Bild

2.Den Befehl direkt an den ConLine-V24-XXL-S Serial LAN Device
Server Netzwerkadapter senden. Wenn ich das jetzt richtig deute müsste 
ich das Beispiel von Yalu X.: "echo -ne '\x02PON\x03' > 
/dev/tcp/192.168.100.100/1002" in ein pyhton script schreiben, damit das 
Programm den Befehl direkt senden kann.

Aber ich kann kein pyhton script schreiben und weis auch nicht ob ich 
richtig liege?
Hoffe ich kann dieses unlösbare Problem mit eurer Hilfe lösen.
Danke euch, dieses Forum ist wirklich nur weiterzuempfehlen.
Angehängte Dateien:
Moderator #5154221
Lesenswert?

Jens schrieb:
> Wenn ich das jetzt richtig deute müsste ich das Beispiel von Yalu X.:
> "echo -ne '\x02PON\x03' > /dev/tcp/192.168.100.100/1002" in ein pyhton
> script schreiben, damit das Programm den Befehl direkt senden kann.

Nein, du brauchst dafür kein Python-, sondern ein Bash-Skript. Zum
Testen kannst du diesen Befehl auch einfach in der Konsole eintippen.

Ich selber konnte das nicht testen, weil ich diesen ConLine-Adapter
nicht habe. Aber laut den Informationen in dessen Handbuch müsste es so
oder so ähnlich gehen.
Gast #5154355
Lesenswert?

Hab den Befehl zum testen direkt in die Konsole eingegeben.
Bekomme folgende Fehlermeldung:
-sh. can´t create /dev/tcp/192.168.188.52/1002: nonexisting directory
-sh: -sh:: not found

Was könnte das bedeuten?
Gast #5154376
Lesenswert?

> -sh. can´t create /dev/tcp/192.168.188.52/1002: nonexisting directory
> -sh: -sh:: not found
>
> Was könnte das bedeuten?

Es könnte sein, dass eine der Verzeichnisstufen
/dev
/dev/tcp
/dev/tcp/192.168.188.52
nicht existiert, und darum die Datei
/dev/tcp/192.168.188.52/1002
nicht angelegt werden kann.
Gast #5154416
Lesenswert?

Jens schrieb:
> Hab den Befehl zum testen direkt in die Konsole eingegeben.
> Bekomme folgende Fehlermeldung:
> -sh. can´t create /dev/tcp/192.168.188.52/1002: nonexisting directory
> -sh: -sh:: not found
>
> Was könnte das bedeuten?

Filenamen wie "/dev/tcp/192.168.188.52/1002" existieren nicht wirklich 
sondern werden von der Bash-Shell speziell ausgewertet. Der "-sh" 
bedeutet aber, dass das nur eine Standard-Shell ist. Das anlegen von 
Verzeichnissen nutzt also nichts, das Verwenden von netcat (wie oben 
beschrieben) schon.
Moderator #5154445
Lesenswert?

A.H. schrieb:
> Filenamen wie "/dev/tcp/192.168.188.52/1002" existieren nicht wirklich
> sondern werden von der Bash-Shell speziell ausgewertet.

Ich dachte, auf dem Raspberry läuft normalerweise eine normale Bash.
Offensichtlich ist dies hier nicht der Fall. Also entweder vorher eine
Bash mit

1
bash

starten oder, falls netcat installiert ist,

1
echo -ne '\x02PON\x03' | nc 192.168.100.100 1002

bzw.

1
echo -ne '\x02PON\x03' | netcat 192.168.100.100 1002

versuchen.
Gast #5154785
Lesenswert?

ich kann die bash datei mit "./ bash_datei.sh" öffnen.
Dann bekomme ich folgende Fehlermeldung:
./ bash_datei.sh line 1: can´t create: /dev/tcp/192.168.188.52/1002: 
nonexisting directory

Meine bash sieht so aus:
echo -ne '\x02PON\x03' > /dev/tcp/192.168.188.31/57195

also unter .sh gespeichert.

Ich könnte mir vorstellen, das sie so ähnlich aussehen müsste:

#!/bin/sh

echo -ne '\x02PON\x03' > /dev/tcp/192.168.188.31/57195
Moderator #5154892
Lesenswert?

Jens schrieb:
> ich kann die bash datei mit "./ bash_datei.sh" öffnen.

Deine Default-Shell ist, wie schon oben deutlich wurde, nicht die Bash
(oder allenfalls eine im restricted Mode). Du musst also explizit
angeben, dass das Skript bzw. der Befehl durch die Bash ausgeführt
werden soll.

Als Skript:

1
bash bash_datei.sh


Als direkter Befehl:

1
bash -c "echo -ne '\x02PON\x03' > /dev/tcp/192.168.188.31/57195"

Hast du die Alternativen mit netcat schon ausprobiert? Die sollten in
jeder Shell funktionieren.
Gast #5157320
Lesenswert?

Mega, dieser Befehl hat super im Terminal funktioniert "echo -ne 
'\x02PON\x03' | nc 192.168.100.100 1002"
Also direkt abgesetzt.

Vielen Dank!!!!

Jetzt muss ich das Ganze aber über ein bash script ans laufen bringen um 
mit meinem Programm den Befehl absetzen zu können.

Es tut mir wirklich leid und ich möchte nicht nerven aber könnte mir 
einer nochmal sagen wie das bash Skript mit dem Befehl auszusehen hat?
Wäre echt toll. Sorry

In meinem Skript steht:
#!/bin/bash
echo -ne '\x02PON\x03' | nc 192.168.188.52 1002

gespeichert unter datei.sh

aufgerufen im Terminal unter bash datei.sh

Leider tut sich da nix.
#5157338
Lesenswert?

Jens schrieb:
> Mega, dieser Befehl hat super im Terminal funktioniert "echo -ne
> '\x02PON\x03' | nc 192.168.100.100 1002"
> Also direkt abgesetzt.
> ...
> In meinem Skript steht:
> #!/bin/bash
> echo -ne '\x02PON\x03' | nc 192.168.188.52 1002
> ...
> Leider tut sich da nix.

Ist der Unterschied beabsichtigt?
192.168.100.100 vs. 192.168.188.52
Gast #5157350
Lesenswert?

Jens schrieb:
>aufgerufen im Terminal unter bash datei.sh

>Leider tut sich da nix.

Wenn man bei Linux ein Programm im aktuellen Ordner
starten möchte, und dieser Ordner sich nicht im
Programmsuchpfad befindet, muß man glaube ich ./
davor setzen. Also:

./datei.sh

Vielleicht liegt es daran?
#5157378
Lesenswert?

Hi

Wenn sich 'nix tut' heißt Das normaler Weise, daß kein Fehler auftrat.
Kannst Du statt dem nc-Aufruf 'tee' in den Script schreiben?
'tee' gibt das Übergebene auf der Komandozeile wieder aus - vll. werden 
nicht alle Argumente übergeben, vll. musst Du weiter Quoten 
(Anführungsstriche)?

Aka nc '12.34.56.78 1002'

MfG

man tee
NAME
       tee - read from standard input and write to standard output and 
files
....
Moderator Persönliche Seite #5157382
Lesenswert?

Patrick J. schrieb:
> Kannst Du statt dem nc-Aufruf 'tee' in den Script schreiben?

Nicht statt, sondern zusätzlich, nämlich:
1
echo -ne '\x02PON\x03' | tee /tmp/datei.log | nc IPADRESSE-HIER 1002

Wenn Du tatsächlich "statt" meintest, kannst Du direkt schreiben:
echo -ne '\x02PON\x03' >/tmp/datei.log


Außerdem empfiehlt sich ein
1
bash -x skript.sh

Dann sieht man, was ausgeführt wird.

Hat man einmal die Datei datei.log, kann man natürlich auch schreiben:

nc IPADRESSE-HIER 1002 < /tmp/datei.log

Hier empfiehlt sich dann aber, die Datei woanders hinzulegen, sonst 
könnte sie einen Reboot nicht überstehen.
Gast #5160086
Lesenswert?

Noch nicht ganz am Ziel.
Hatte gedacht jetzt bekomme ich den Rest hin aber Pustkuchen :-(

Also kurz zusammengefasst:
1) Das .sh Skript "beameron.sh" ist in dem  Pfad "storage/downloads"
2) Befinde ich mich in dem Pfad Downloads und gebe: "bash -x 
beameron.sh"  in den Terminal geht mein Beamer an.

So jetzt will ich aber wie gesagt mit dem Programm Cinemavision den 
Befehl auslösen.
Das sollte ungefähr so aussehen: 
command:///storage/downloads/beameron.sh
Leider funktioniert das nicht.

Gebe ich das direkt in den Terminal: /storage/downloads/beameron.sh
Öffnet sich das file auch nicht.

Ich denke der Fehler liegt irgendwo bei: 
command:///storage/downloads/beameron.sh

Denn im Terminal unter dem Pfad Downloads mit dem Befehl: "bash -x 
beameron.sh" funktioniert es ja???????
Gast #5160344
Lesenswert?

chmod +x /storage/downloads/beameron.sh habe ich schon gemacht.
Wenn ich command:bash -x ///storage/downloads/beameron.sh in Putty 
schreibe bekomme ich command:bash not found, gebe ich bash -x 
///storage/downloads/beameron.sh in Putty ein dann funktioniert es.

command:bash -x ///storage/downloads/beameron.sh in dem Programm 
Cinemavision funktioniert leider auch nicht.
Gast #5160400
Lesenswert?

Ich vermute, dein Cinemavision läuft unter einem anderen User.
gib mal bitte die folgenden Kommandos in der Shell ein:

chmod a+rx /storage
chmod a+rx /storage/downloads
chmod a+rx /storage/downloads/beameron.sh

in Cinemavision sollte das Kommando wie folgt sein:
command:///storage/downloads/beameron.sh
#5160403
Lesenswert?

Könnte Es ein Rechte-Problem sein?
Da Du im Terminal SUDO bist, sollte das Script aber auch mit diesen 
Rechten laufen und diese Rechte an die selbst aufgerufenen Scripte 
vererben - mache selber aber nicht viel mit höheren Rechten - bis auf 
'updateme', Welches mir apt-get zum Updaten aufruft (per sudo), bin ich 
immer nur User.
Wenn sudo erforderlich ist, packe Das vor den Aufruf im Script.
Beim Aufruf mit sudo-Rechten sollte keine erneute Passwortabfrage 
kommen.

Wäre mir aber 'unangenehm', wenn da irgendwo ein Script läuft, den nicht 
ich geschnitzt habe - Der darf dann auch 'sudo' spielen.

MfG
#5160418
Lesenswert?

Diese not found Meldung beim direkten Aufruf des scripts mit dem 
absoluten Pfad ist sehr interressant. Könnte es sein, dass sich bash 
nicht unter /bin/bash befindet? Was geben "which bash" und "realpath 
/proc/$$/exe" oder "ls -l /proc/$$/exe" oder "echo $SHELL" aus? Falls 
die ausgabe nicht /bin/bash ist, setze das ausgegebene im Script nach 
dem #! ein. In dem fall hättest du das Problem dann aber mit so ziemlich 
jedem bash script, und ein Symlink in bin könnte sich als sinvoll 
erweisen.
Gast #5160423
Lesenswert?

Autsch, vertan...

soweit ich es erkenne liegt das Script nicht in /storage/downloads, 
sondern in /home/kino/storage/downloads (oder ähnlich)

kannst du mal bitte die Ausgabe von
pwd
posten und das Kommando
/home/kino/storage/downloads/beameron.sh
testen?
Gast #5160465
Lesenswert?

Hmm,

dann nochmal strukturiert:

1) Das folgende Kommando schaltet den Beamer ein, richtig?
echo -ne '\x02PON\x03' | nc 192.168.188.52 1002

2) Bitte poste die Ausgabe der folgenden Kommandos:
ls -l /storage/downloads/beameron.sh
cat /storage/downloads/beameron.sh
ls -l /usr/bin/bash
Gast #5160479
Lesenswert?

1. Das Kommando schaltet den Beamer ein:
#!/bin/bash
echo -ne '\x02PON\x03' | tee | nc 192.168.188.52 1002

2.
ls -l /storage/downloads/beameron.sh   =
-rwxr-xr-x  1 root    root   (Datum Uhrzeit) 
/storage/downloads/beameron.sh


cat /storage/downloads/beameron.sh     =
#!/usr/bin/bash
echo -ne '\x02PON\x03' | tee | nc 192.168.188.52 1002LibreELEC:~#


ls -l /usr/bin/bash     =
lrwxrwxrwx     1 root    root   (Datum Uhrzeit)   /usr/bin/bash-> 
busybox
Gast #5160491
Lesenswert?

ok, ändere die zweite Zeile bitte in

echo -ne '\x02PON\x03' | nc 192.168.188.52 1002

Die wesentliche Veränderung ist das Löschen des Anhangs.
Tee kann auch Entfernt werden, da es hier eigentlich nichts bringt.
#5160493
Lesenswert?

JJ schrieb:
> ok, ändere die zweite Zeile bitte in
>
> echo -ne '\x02PON\x03' | nc 192.168.188.52 1002
>
> Die wesentliche Veränderung ist das Löschen des Anhangs.

Es könnte auch sein, dass die Datei in der letzten Zeile kein newline 
hat. cat würde dann auch kein newline am ende ausgeben, und der nächste 
prompt von sh würde angehängt.
Gast #5160500
Lesenswert?

Daniel A. schrieb:
> Es könnte auch sein, dass die Datei in der letzten Zeile kein newline
> hat. cat würde dann auch kein newline am ende ausgeben, und der nächste
> prompt von sh würde angehängt.

Ja stimmt, das ist auch möglich.

Mir würden ansonsten nur noch Windows Zeilenumbrüche einfallen. Aber ich 
habe keine Vorstellung wie man das über ein Forum debuggen kann.
Hast du eine Idee?
#5160514
Lesenswert?

Ja, die Ausgabe jeder der Befehle müsste Aufschluss über die Zeilenenden 
bringen, aber ich weiss nicht ob die ersten beiden unter busybox 
verfügbar sind, und ich weiss nicht ob busyboxes bash bei der Dritten 
des $'\r' als Argument korrekt an grep übergibt, oder dort ein false 
negative möglich wäre.
Gast #5160536
Lesenswert?

Um defekte Zeilenenden auszuschließen können wir die Datei auch noch 
einmal neu schreiben, bzw. zur Sicherheit eine neue anlegen.

Das kannst du mit diesen Kommandos in PuTTY erreichen:
1
echo '#!/bin/bash' > /storage/downloads/beameron1.sh
2

3
echo "echo -ne '\\x02PON\\x03' | nc 192.168.188.52 1002" > /storage/downloads/beameron1.sh
4

5
chmod 755 /storage/downloads/beameron1.sh
6

7
/storage/downloads/beameron1.sh
Gast #5160539
Lesenswert?

Wichtige Korrektur:
In der zweiten Zeile fehlt ein >
1
echo '#!/bin/bash' > /storage/downloads/beameron1.sh
2

3
echo "echo -ne '\\x02PON\\x03' | nc 192.168.188.52 1002" >> /storage/downloads/beameron1.sh
4

5
chmod 755 /storage/downloads/beameron1.sh
6

7
/storage/downloads/beameron1.sh

Wenn es schon zu spät war, einfach die kompletten 4 Zeilen in der 
Reihenfolge nochmal ausführen.
Gast #5160543
Lesenswert?

Ach verdammt, noch mehr Korrekturen:
1
echo '#!/bin/sh' > /storage/downloads/beameron1.sh
2

3
echo "echo -ne '\\x02PON\\x03' | nc 192.168.188.52 1002" >> /storage/downloads/beameron1.sh
4

5
chmod 755 /storage/downloads/beameron1.sh
6

7
/storage/downloads/beameron1.sh

Diesmal gehen wir bei der Shell auf Sicher
#5160560
Lesenswert?

JJ schrieb:
> Diesmal gehen wir bei der Shell auf Sicher

Das echo builtin von sh untertützt keine Argumente. Also entweder doch 
bash:
1
echo '#!/usr/bin/bash' > /storage/downloads/beameron1.sh
2
printf "echo -ne '\\\x02PON\\\x03' | nc 192.168.188.52 1002\n" >> /storage/downloads/beameron1.sh
3
chmod 755 /storage/downloads/beameron1.sh

Oder so, mit sh, wenn man auf Nummer sicher gehen will:
1
echo '#!/bin/sh' > /storage/downloads/beameron1.sh
2
printf "printf '\\\002PON\\\003' | nc 192.168.188.52 1002\n" >> /storage/downloads/beameron1.sh
3
chmod 755 /storage/downloads/beameron1.sh
Gast #5160592
Lesenswert?

Problem gelöst. Durch ein Mitglied in einem anderen Forum.
Ihr hattet mit Zeilenumbruch recht.
Es war ein "DOS line endings created by Windows editor" Problem.
Nachdem ich: "dos2unix /storage/downloads/beameron.sh" in den Putty 
Terminal eingegeben habe, funktioniert es im Terminal 
unter:"/storage/downloads/beameron.sh" und in Cinemavision 
unter:"Command:///storage/downloads/beameron.sh.
Ohne eure Hilfe hätte das nicht funktioniert.
Vielen Dank, das ihr so viel Zeit in mein Problem investiert habt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren