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 个注释

2
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); // 向 /dev/ttyS0 写入 0x41 或 'A'

// 将 result_length 替换为您预期的命令结果长度
for ($i=0;$i < result_length;$i++) {
$result .=dio_read($fd, 1);
}
echo
$result;
?>

参考
- POSIX 操作系统的串行编程指南,http://www.easysw.com/~mike/serial/
- stty 手册页
0
healer at colorado dot edu
21 年前
起初这让我很沮丧,因为我试图让我的 Linux 系统与外部串行设备(一个 PIC18F452 可编程芯片)通信,而这里提供的示例引用了 PHP 文档中没有的 fcntl() 和 open() 参数。

我最终通过手册页找到了每个参数的作用

man open
man fcntl

仍然没有让它工作,也不知道如何重置 ttySx,但认为这可能对某些人有所帮助……
-3
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