如何解决PHP Serial类读取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

