Start · Sprachen · PHP · Referenz · dio_tcsetattr

dio_tcsetattr

Funktion

Setzt Terminalattribute und Baudrate für eine serielle Schnittstelle, die mit <code>dio_open()</code> geöffnet wurde.

seit PHP 4.3.0 Kategorie: io

Signatur

dio_tcsetattr(resource $fd, array $options): bool

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:
  • baud (int) – Baudrate, z. B. 9600, 19200, 115200
  • bits (int) – Datenbits pro Zeichen, typisch 5, 6, 7 oder 8
  • stop (int) – Stoppbits, 1 oder 2
  • parity (int) – Parität: 0 = keine, 1 = ungerade, 2 = gerade

Rückgabewert

Typ
bool
Beschreibung
Gibt 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);
Serielle Schnittstelle erfolgreich konfiguriert. Antwort: OK

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);
Baudrate 115200 erfolgreich gesetzt.

// 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().