dio_tcsetattr

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

dio_tcsetattr 设置串行端口的终端属性和波特率

描述

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

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_read 会等到在 /dev/ttyS0 中输入 0x0A/LF 或其他控制字符才会返回读取结果,当您使用 dio_write 时,它也会在消息的末尾自动发送 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