Signatur
Beschreibung
dio_tcsetattr() konfiguriert die Terminalparameter eines über dio_open() geöffneten seriellen Dateideskriptors. Damit lassen sich typische Parameter einer seriellen Kommunikation wie Baudrate, Datenbits, Stoppbits und Parität festlegen – ähnlich wie das POSIX-Äquivalent tcsetattr() in C.
Die Funktion ist besonders nützlich, wenn PHP direkt mit seriellen Geräten kommunizieren soll, etwa mit Mikrocontrollern, Modems, industriellen Steuerungen oder anderen RS-232/RS-485-Geräten. Sie ersetzt die umständliche Shell-basierte Konfiguration über stty und ermöglicht eine portable, in PHP eingebettete Lösung.
Die Optionen werden als assoziatives Array übergeben. Unterstützte Schlüssel sind baud (Baudrate), bits (Datenbits pro Zeichen), stop (Anzahl Stoppbits) und parity (Parität: 0 = keine, 1 = ungerade, 2 = gerade). Nicht alle Kombinationen sind auf jedem System verfügbar; ungültige Werte können zu unerwartetem Verhalten führen.
Hinweis: Diese Funktion steht nur auf Unix-ähnlichen Systemen zur Verfügung und erfordert die PECL-Erweiterung dio, da sie seit PHP 5.1 nicht mehr im PHP-Kern enthalten ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $fd Pflicht | resource | Ein durch dio_open() erzeugter Dateideskriptor, der eine serielle Schnittstelle repräsentiert. |
|
| $options Pflicht | array | Assoziatives Array mit Terminal-Einstellungen. Mögliche Schlüssel:
|
Rückgabewert
true bei Erfolg zurück, false wenn die Attribute nicht gesetzt werden konnten (z. B. bei ungültigem Dateideskriptor oder nicht unterstützten Optionen).Beispiele
Serielle Schnittstelle öffnen und konfigurieren
<?php
// Serielle Schnittstelle öffnen (Linux-Gerätedatei)
$fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);
if ($fd === false) {
die('Konnte /dev/ttyS0 nicht öffnen.');
}
// Terminalattribute setzen: 9600 Baud, 8 Datenbits, 1 Stoppbit, keine Parität
$result = dio_tcsetattr($fd, [
'baud' => 9600,
'bits' => 8,
'stop' => 1,
'parity' => 0,
]);
if ($result) {
echo "Serielle Schnittstelle erfolgreich konfiguriert.\n";
} else {
echo "Fehler beim Setzen der Terminalattribute.\n";
}
// Daten senden
dio_write($fd, "AT\r\n");
// Antwort lesen
$response = dio_read($fd, 128);
echo "Antwort: " . $response . "\n";
dio_close($fd);
Konfiguration mit höherer Baudrate für schnellere Geräte
<?php
// Öffnen eines USB-zu-Seriell-Adapters
$fd = dio_open('/dev/ttyUSB0', O_RDWR | O_NOCTTY);
if ($fd === false) {
die('Gerät nicht gefunden.');
}
// 115200 Baud, 8N1 (8 Datenbits, keine Parität, 1 Stoppbit)
$ok = dio_tcsetattr($fd, [
'baud' => 115200,
'bits' => 8,
'stop' => 1,
'parity' => 0,
]);
echo $ok
? "Baudrate 115200 erfolgreich gesetzt.\n"
: "Fehler: Baudrate konnte nicht gesetzt werden.\n";
dio_close($fd);
// Wichtig · Fallstricke
Plattform: dio_tcsetattr() ist ausschließlich auf Unix-ähnlichen Betriebssystemen (Linux, macOS, BSD) verfügbar. Unter Windows steht die Funktion nicht zur Verfügung.
PECL-Erweiterung: Seit PHP 5.1 ist der dio-Funktionsumfang aus dem PHP-Kern ausgegliedert. Die Erweiterung muss als PECL-Paket (pecl install dio) installiert und in der php.ini aktiviert werden.
Gerätezugriff: Der aufrufende Prozess muss Lese- und Schreibrechte auf die Gerätedatei (z. B. /dev/ttyS0) besitzen. Unter Linux ist der Benutzer häufig der Gruppe dialout hinzuzufügen.
Ungültige Werte: Nicht unterstützte Baudraten oder Kombinationen können stillschweigend ignoriert oder auf den nächstmöglichen Wert gerundet werden – das Verhalten ist systemabhängig. Überprüfe die gesetzten Werte im Zweifelsfall mit dio_stat().