PHP und Ausgabe auf einer seriellen Schnittstelle

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
hackbard4711
Beiträge: 310
Registriert: 15.07.2005 20:15:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Koblenz
Kontaktdaten:

PHP und Ausgabe auf einer seriellen Schnittstelle

Beitrag von hackbard4711 » 06.07.2006 11:00:23

Hi,
stehe vor einem kleinem Problem ok eigentlich ist es für mich ein großes Problem.

Also ich muss es irgendwie schaffen an einem seriellen Port am Server ein Signal raus zu bekommen. Vorzugsweise direkt mit php.

Ich habe nun schon einiges gegooglet aber komm zu keinem Ergebnis. Nur das hier habe ich gefunden: http://www.php.net/manual/de/function.fopen.php#20935

Code: Alles auswählen

$fp = fopen ("/dev/ttys0", "w+");
Bei diesem PHP-Code bekomme ich folgende Fehlermeldung

Code: Alles auswählen

fopen(/dev/ttys1): failed to open stream: Input/output error
Habe an dem Server zwei serielle Schnittstellen und kann meine Schaltung dran hängen wo ich will und die ttysX ändern wie ich will, es passiert einfach nichts. Hab versuchsweise mal ein USBtoSeriell-Kabel angeschlossen aber da hänge ich am gleichen problem. Das Treibermodul für das Kabel ist geladen und bekomme das Kabel auch unter lsusb angezeigt. Allerdings bekomme ich dann eine etwas andere Fehlerausgabe.

Code: Alles auswählen

Warning: fopen(/dev/ttyUSB1): failed to open stream: Permission denied
Habe den Benutzer www-data auch mal der Gruppe dialout hinzugefügt aber geht trotzdem nicht.

Wäre nett wenn mir einer einen ganz einfachen weg zeigen kann, damit ich an dem Port was ausgegeben bekomme (mittels PHP).

Danke schon mal im vorraus
Never touch a running System ! ! !
________
MFG

hacki

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 06.07.2006 11:40:20

hi,

lass mal das "+" hinter dem "w" weg. Es kann gut sein,
dass man die Schnittstelle nicht zum schreiben und lesen
öffnen kann. Und lesen musst du ja (hoffentlich) nicht.

Mit USB würde ich garnicht erst anfangen, da gibt es noch
viel mehr Fehlermöglichkeiten.

Und dann würde ich das "s" in "ttyS0" gross schreiben,
nur zwecks der Schönheit.
Beware of programmers who carry screwdrivers.

Benutzeravatar
hackbard4711
Beiträge: 310
Registriert: 15.07.2005 20:15:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Koblenz
Kontaktdaten:

Beitrag von hackbard4711 » 06.07.2006 14:05:55

Danke für deine Hilfen. Aber leider hat dein Tip nichts gebracht. Weder ohne das + noch mit ttyS0 noch sonst was. :( Wäre dankbar für weiter Tips
Never touch a running System ! ! !
________
MFG

hacki

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 06.07.2006 15:17:19

kannst du (oder hast du schon) die Hardware und die Schnittstelle
mit picocom testen und die Fehlermeldungen hier posten?
Interessant waeren noch die Ausgaben von

Code: Alles auswählen

grep tty /var/log/dmesg
ls -l /dev/ttyS*
grep SERIAL /boot/config* | grep -v USB
Picocom ist ein Terminal-Emulator, der fast nichts kann, aber das
entscheidende richtig macht. Es gibt ein eigenes Debian-Paket.

Musst du wirklich nur einen Text an die Hardware schicken oder
braucht die ein bestimmtes Protokoll oder Handshake? Oder
wird direkt mit den DTR-/RTS-Signalen gearbeitet?
Ja, ich weiss, ich soll nicht so neugierig sein ;)
Beware of programmers who carry screwdrivers.

Benutzeravatar
hackbard4711
Beiträge: 310
Registriert: 15.07.2005 20:15:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Koblenz
Kontaktdaten:

Beitrag von hackbard4711 » 06.07.2006 15:25:08

Macht nichts :) frag ruhig. Also an einem Pin soll ein Relay sein das die Stromzufuhr von einem Router kappt und danach wieder Strom drauf gibt damit der Router wieder gesartet werden kann. Also möchte ich nur mit einem Pin arbeiten wo ich einmal eine 1 drauf geben kann und dannach wieder eine 0 keine Protokolle und nichts :wink:

Code: Alles auswählen

remoteserver:~# grep tty /var/log/dmesg
ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
remoteserver:~#

Code: Alles auswählen

remoteserver:~# ls -l /dev/ttyS*
crw-rw----  1 root dialout 4, 64 2006-07-06 11:09 /dev/ttyS0
crw-rw----  1 root dialout 4, 65 2006-07-06 09:25 /dev/ttyS1
crw-rw----  1 root dialout 4, 66 2005-02-26 07:39 /dev/ttyS2
crw-rw----  1 root dialout 4, 67 2005-02-26 07:39 /dev/ttyS3
crw-rw----  1 root dialout 4, 68 2005-02-26 07:39 /dev/ttyS4
remoteserver:~#

Code: Alles auswählen

remoteserver:~# grep SERIAL /boot/config* | grep -v USB
CONFIG_PARPORT_SERIAL=m
CONFIG_MOUSE_SERIAL=m
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_ESPSERIAL is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_CS=m
# CONFIG_SERIAL_8250_ACPI is not set
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
CONFIG_SERIAL_8250_MULTIPORT=y
CONFIG_SERIAL_8250_RSA=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SND_SERIAL_U16550=m
remoteserver:~#
Never touch a running System ! ! !
________
MFG

hacki

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 06.07.2006 16:54:04

Als welcher User hast du denn versucht auf /dev/ttyS0 zuzugreifen?
Den Berechtigungen nach kann da nur root und Mitglieder der Gruppe dialout zugreifen.

Benutzeravatar
hackbard4711
Beiträge: 310
Registriert: 15.07.2005 20:15:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Koblenz
Kontaktdaten:

Beitrag von hackbard4711 » 06.07.2006 16:57:10

Als user www-data. Weil das ja vom PHP-Script bzw von dem PHP interpreter ausgeführt wird. Aber habe den user www-data auch der Gruppe Dialout hinzugefügt. Aber klappt trotzdem nicht.
Never touch a running System ! ! !
________
MFG

hacki

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 06.07.2006 17:21:07

ist denn der Webserver neu gestartet worden, seit "www-data"
zur Gruppe "dialout" gehoert? Die Gruppen-Zugehoerigkeit wird
nur beim Anmelden uebernommen.
Beware of programmers who carry screwdrivers.

Benutzeravatar
hackbard4711
Beiträge: 310
Registriert: 15.07.2005 20:15:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Koblenz
Kontaktdaten:

Beitrag von hackbard4711 » 06.07.2006 17:31:22

Ich faul ab jetzt gehts. :? :oops: :D Naja wäre aber ganz cool wenn ich jetzt noch wüsste wie ich ein bestimmten Pin auf 1 setze. Weis wohl wie ich ein Datenword rausbekomme, aber will ja nur das für eine bestimmte ZEIT ein Pin auf 1 steht sonst am besten keiner

Danke aber auf den Kram mit dem neustart wäre ich echt nicht gekommen... :wink:
Never touch a running System ! ! !
________
MFG

hacki

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 06.07.2006 17:47:21

Na also.
Jetzt muss dein PHP-Programm nach dem "fopen" eine Pause
von z.B. 3 Sekunden machen und dann ein "fclose (fp)".
Das fopen sollte den DTR-Ausgang (Pin 4) auf "1" schalten,
dort bleibt er solange, bis das fclose ihn wieder abschaltet.
Wenn das nicht tut, koennte ttyS0 und ttyS1 verwechselt sein.
Eine 2. Chance waere der RTS-Ausgang (Pin 7).

Es kann aber leicht sein, dass es mit PHP garnicht geht.
Dann brauchst du ein C-Programm, das von PHP z.B. mit
"exec" gestartet wird und den Pin umschaltet.
Beware of programmers who carry screwdrivers.

Benutzeravatar
hackbard4711
Beiträge: 310
Registriert: 15.07.2005 20:15:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Koblenz
Kontaktdaten:

Beitrag von hackbard4711 » 06.07.2006 18:14:26

Danke noch mal. Also habs jetzt mal ausprobiert und bekomme es leider nicht hin. Ich denke auch das das zurückgreifen auf ein cpp Programm oder so die einzigste Möglichkeit ist. Allerdings habe ich leider keine Ahnung von Hardwareprogrammierung unter C++. Muss mal schauen ob ich da was finde. C++ ist anfür sich kein Thema nur die Hardwareprogrammierung habe ich wie gesagt noch nie gemacht. Werde ich mich aber morgen auf jeden Fall mit auseinander setzen müssen.

Danke noch mal
Never touch a running System ! ! !
________
MFG

hacki

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 06.07.2006 18:36:07

Ganz so schlimm ist es nicht, zwischen Hardware und deinem
Programm ist ja noch ein Betriebssystem. Also brauchst du
nur 2 bis 3 System-Aufrufe. Hier ist ein Programm versteckt,
das den TX-Ausgang (Pin 3) schaltet. Es so umzustricken, dass
es z.B. DTR schaltet, bleibt dem Leser als Uebungsaufgabe...
Damit es nicht zu einfach wird, hat es keine Kommentare
und ist kein C++ :)
Beware of programmers who carry screwdrivers.

Benutzeravatar
hackbard4711
Beiträge: 310
Registriert: 15.07.2005 20:15:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Koblenz
Kontaktdaten:

Beitrag von hackbard4711 » 06.07.2006 18:41:25

:lol: Sieht ja garnicht alzu komplex aus. Werde mich morgen damit auseinander setzen. Hab heute nach mehr als 12h PHP pur keine bock mehr :)

Danke
Never touch a running System ! ! !
________
MFG

hacki

Benutzeravatar
hackbard4711
Beiträge: 310
Registriert: 15.07.2005 20:15:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Koblenz
Kontaktdaten:

Beitrag von hackbard4711 » 08.07.2006 09:17:49

So muss noch mal danke sagen... Dein C Programm funktioniert :lol: :wink: 8)
Never touch a running System ! ! !
________
MFG

hacki

Antworten