You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决PHP Serial类读取COM7串口数据失败的问题

PHP串口脚本无法读取COM7数据的解决方法

问题背景

在Windows 10的Wampserver环境下,使用PhpSerial类编写的脚本无法读取COM7端口的数据。PuTTY和TeraTerm能正常与该串口通信,但脚本始终重复输出以下内容:

Waiting data...
COM not receive data.
Waiting 5 seconds...

脚本代码如下:

<?php
require_once('PhpSerial.php');

$serial = new PhpSerial;
$serial->deviceSet("COM7");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("xon/xoff");

if (!$serial->deviceOpen()) {
    die("Error: Cant open port.");
}

function handleDataReceived($serial) {
    $data_rec = $serial->readPort();

    if (!empty($data_rec)) {
        echo "New data: " . trim($data_rec);
    } else {
        echo "COM not receive data.";
    }
}

$interval = 5;

while (true) {
    echo "Waiting data...";
    handleDataReceived($serial);
    echo "Waiting $interval seconds...";
    sleep($interval);
}

$serial->deviceClose();
?>

解决步骤

  • 对齐串口配置参数
    确保PHP脚本的串口参数和PuTTY/TeraTerm完全一致,重点检查流控设置。如果PuTTY中设置的是「无流控」或「RTS/CTS」,将脚本中的confFlowControl改为对应值,比如:

    $serial->confFlowControl("none");
    
  • 提升端口访问权限
    Windows串口端口需要管理员权限才能正常访问,右键点击Wampserver启动图标,选择「以管理员身份运行」后再执行脚本。同时确保没有其他程序(如PuTTY)占用COM7端口——串口同一时间只能被一个程序独占。

  • 优化数据读取逻辑
    PhpSerial的readPort()默认仅读取缓冲区当前数据,可能因数据未及时到达导致读取为空。修改handleDataReceived函数,增加超时设置并循环读取:

    function handleDataReceived($serial) {
        // 设置2秒读取超时
        $serial->confTimeout(2);
        $data_rec = '';
        // 循环读取直到获取数据或超时
        while ($chunk = $serial->readPort()) {
            $data_rec .= $chunk;
        }
        if (!empty($data_rec)) {
            echo "New data: " . trim($data_rec) . PHP_EOL;
        } else {
            echo "COM not receive data." . PHP_EOL;
        }
    }
    

    如果设备需要主动触发才会返回数据,在deviceOpen()后添加指令发送代码,比如:

    $serial->sendMessage("request_data\r\n");
    
  • 修正Windows设备路径
    Windows下部分串口需要用特殊路径识别,尝试将设备路径改为\\.\COM7(转义后为\\\\.\\COM7):

    $serial->deviceSet("\\\\.\\COM7");
    
  • 启用错误日志排查
    在脚本开头添加错误日志配置,查看隐藏的串口操作错误:

    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    ini_set('log_errors', 1);
    ini_set('error_log', 'serial_error.log');
    

    执行脚本后查看生成的serial_error.log文件,定位具体报错信息。

内容的提问来源于stack exchange,提问作者BlackSD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:15:17