使用外置设备,通过串口发送和接收数据。那么,就要在php端有个串口的操作代码。
PHP 的 dio 扩展(Direct I/O)提供了对底层 I/O 操作的访问,包括串口通信。通过 dio 扩展,你可以直接操作串口设备文件(如 /dev/ttyUSB0 或 COM1)来实现串口通信。
1. 安装 dio 扩展
dio 扩展是 PHP 的一个 PECL 扩展。你可以通过以下步骤安装:
在 Linux 上安装:1
2
3sudo apt-get install php-dev # 安装 PHP 开发工具
sudo pecl install dio # 安装 dio 扩展
安装完成后,在 php.ini 文件中启用扩展:
1 | extension=dio.so |
2. 使用 dio 实现串口通信
以下是一个使用 dio 扩展实现串口通信的示例代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34<?php
// 串口设备路径
$device = '/dev/pts/4'; // Linux
// $device = 'COM1'; // Windows
// 打开串口设备
$fd = dio_open($device, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (!$fd) {
die("无法打开串口设备: $device\n");
}
// 配置串口参数
dio_tcsetattr($fd, [
'baud' => 9600, // 波特率
'bits' => 8, // 数据位
'stop' => 1, // 停止位
'parity' => 0, // 校验位 (0: none, 1: odd, 2: even)
'flow_control' => 0, // 流控制 (0: none, 1: hardware)
]);
// 发送数据到串口
$message = "你好我在https://erik.xyz上出生了!";
dio_write($fd, $message);
echo "已发送: $message";
// 从串口读取数据
$data = dio_read($fd, 1024); // 读取最多 1024 字节
echo "已接收: $data\n";
// 关闭串口
dio_close($fd);
?>
3. 代码说明
dio_open: 打开串口设备文件。O_RDWR 表示以读写模式打开,O_NOCTTY 表示不将设备作为控制终端,O_NONBLOCK 表示非阻塞模式。
dio_tcsetattr: 配置串口参数,包括波特率、数据位、停止位、校验位和流控制。
dio_write: 向串口写入数据。
dio_read: 从串口读取数据。
dio_close: 关闭串口设备。
4. 串口参数配置
dio_tcsetattr 的配置选项:
baud: 波特率(如 9600、19200、38400、57600、115200)。
bits: 数据位(通常为 8)。
stop: 停止位(1 或 2)。
parity: 校验位(0: 无校验,1: 奇校验,2: 偶校验)。
flow_control: 流控制(0: 无流控制,1: 硬件流控制)。
那么这时候需要测试一下代码。那总不能真的找个串口设备吧,然而虚拟串口真香。
5.在Linux中使用 socat 模拟虚拟串口
socat 是一个强大的工具,可以创建虚拟串口对。
安装 socat:
在Debian/Ubuntu系统上:
1 | sudo apt update |
创建虚拟串口对:
运行以下命令创建一对虚拟串口:
1 | socat -d -d pty,raw,echo=0 pty,raw,echo=0 |
运行后如图:
这样可以看到出现两个虚拟串口。
把上面的php代码放到文件中运行一下:
同时新开个窗口执行:cat /dev/pts/5
来读取串口数据。
如下图:
这里是发送数据,那接收数据怎么看呢。
那就在代码上改造一下加个for:1
2
3// 从串口读取数据
$data = dio_read($fd, 1024); // 读取最多 1024 字节
echo "已接收: $data\n";
这里改造主要是测试用,实际上不需要。1
2
3
4
5
6
7//测试接收
for($i=0;$i<20;$i++){
sleep(3);
// 从串口读取数据
$data = dio_read($fd, 1024); // 读取最多 1024 字节
echo "已接收: $data\n";
}
那么,再次运行php代码,然后在新窗口运行echo "欢迎你出生在https://erik.xyz" > /dev/pts/5
来发送信息,你会看到如图的接收:
到这里,发送和接收串口已经好了。
本文链接: https://erik.xyz/2025/01/03/php-serial-port-development/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!