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

PHP串口通信无法读取QR阅读器输出问题求助

解决PHP-Serial读取QR阅读器串口数据失败的问题

关键排查与修复点

  • 添加端口初始化延迟
    部分串口设备在端口打开后需要短暂的初始化时间,直接读取会错过数据。在deviceOpen()后添加延迟,给设备准备时间:

    usleep(500000); // 延迟500毫秒
    
  • 优化读取循环逻辑
    原代码的循环条件会导致单次读取到数据后重置等待状态,可能丢失分段传输的内容。改为持续读取直到超时,同时检测扫码数据的结束标记(多数扫码器会以换行/回车结尾):

  • 指定读取字节长度
    readPort()默认读取字节数有限,明确指定读取长度(如1024字节),确保能获取完整的扫码数据:

    $read = $serial->readPort(1024);
    
  • 检查进程权限
    若PHP运行在Web服务器(Apache/IIS)中,需确保服务器进程拥有串口访问权限,可尝试以管理员身份启动服务器。


修改后的完整代码

<?php
include 'src/PhpSerial.php';

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}

$serial = new PhpSerial;

// 保持与Hercules一致的串口配置
$serial->deviceSet("COM1");
$serial->confBaudRate(115200);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");

// 打开串口
$serial->deviceOpen();

// 设备初始化延迟
usleep(500000);

$theResult = '';
$start = microtime_float();

// 延长超时至5秒,覆盖扫码操作的时间
while (microtime_float() <= $start + 5) {
    $read = $serial->readPort(1024);
    if ($read !== '') {
        $theResult .= $read;
        // 检测扫码数据结束标记,提前终止循环
        if (strpos($theResult, "\n") !== false || strpos($theResult, "\r") !== false) {
            break;
        }
    }
    // 降低CPU占用
    usleep(10000);
}

// 调试输出结果
var_dump(trim($theResult));

$serial->deviceClose();
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:21:32