PHP Conference Japan 2024

dio_tcsetattr

(PHP 4 >= 4.3.0, PHP 5 < 5.1.0)

dio_tcsetattr 設定序列埠的終端機屬性和鮑率

說明

dio_tcsetattr(資源 $fd, 陣列 $options): 布林值

dio_tcsetattr() 設定已開啟 fd 的終端機屬性和鮑率。

參數

fd

dio_open() 所傳回的檔案描述器。

options

目前可用的選項如下:

  • 'baud' - 連接埠的鮑率 - 可以是 38400, 19200, 9600, 4800, 2400, 1800, 1200, 600, 300, 200, 150, 134, 110, 75 或 50,預設值為 9600。

  • 'bits' - 資料位元 - 可以是 8, 7, 6 或 5。預設值為 8。

  • 'stop' - 停止位元 - 可以是 1 或 2。預設值為 1。

  • 'parity' - 可以是 0, 1 或 2。預設值為 0。

傳回值

無傳回值。

範例

範例 #1 設定序列埠的鮑率

<?php

$fd
= dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);

dio_fcntl($fd, F_SETFL, O_SYNC);

dio_tcsetattr($fd, array(
'baud' => 9600,
'bits' => 8,
'stop' => 1,
'parity' => 0
));

while (
1) {

$data = dio_read($fd, 256);

if (
$data) {
echo
$data;
}
}

?>

注意事項

注意此函式在 Windows 平台上未實作。

新增筆記

使用者貢獻的筆記 3 則筆記

daniel widyanto (kunilkuda at gmail dot com)
19 年前
我正在使用 PHP 與我的 AVR 微控制器在 /dev/ttyS0 上進行介面連接。我猜其他人也一樣。

這裡有一些提示
- dio_tcsetattr -> 設定為啟用
- RTS / CTS 硬體控制
- ICANON 模式
(這表示當您使用 dio_write 時,dio_read 會等待直到在 /dev/ttyS0 中輸入 0x0A/LF 或其他控制字元後才會返回讀取結果,它也會在訊息的結尾自動發送 0x0A/LF 到您的裝置)。

對於不需要 RTS/CTS 和/或 ICANON 的使用者,您可以使用 Linux 指令:stty。

這是我的

<?php
exec
('stty -F /dev/ttyS0 4800 raw');

$fd=dio_open('/dev/ttyS0',O_RDWR | O_NOCTTY | O_NDELAY);
dio_fcntl($fd,F_SETFL,0);

dio_write($fd,"\x41",1); // 寫入 0x41 或 'A' 到 /dev/ttyS0

// 將 result_length 替換為您預期的指令結果長度
for ($i=0;$i < result_length;$i++) {
$result .=dio_read($fd, 1);
}
echo
$result;
?>

參考
- POSIX 作業系統的序列埠程式設計指南, http://www.easysw.com/~mike/serial/
- stty 使用手冊
healer at colorado dot edu
21 年前
一開始很令人沮喪,因為我試圖讓我的 Linux 電腦與外部序列埠裝置(一個 PIC18F452 可程式設計晶片)通訊,而這裡提供的範例提到了 PHP 文件中沒有的 fcntl() 和 open() 參數。

我終於透過使用手冊找到了每個參數的用途

man open
man fcntl

仍然無法讓它正常工作,也不知道如何重置 ttySx,但我想這可能會對某些人有所幫助...
fherrero at noticiasdenavarra dot com
19 年前
對於 Windows 來說,範例 1 看起來像這樣

<?php

exec
('mode com1: baud=9600 data=8 stop=1 parity=n xon=on');
// 在 Windows 的命令列中執行 'help mode' 以取得說明

$fd = dio_open('com1:', O_RDWR);

while (
1) {

$data = dio_read($fd, 256);

if (
$data) {
echo
$data;
}
}

?>
To Top