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
相关产品推荐
相关产品推荐

