返回

PHP Serial 类读取 COM 端口数据的终极指南:解决“COM 未收到数据”问题

php

使用 PHP Serial 类从 COM 端口读取数据的终极指南

问题陈述

当你尝试使用 PHP Serial 类从 COM7 端口读取数据时,你可能会遇到错误消息“等待数据... COM 未收到数据。等待 5 秒钟...”

解决方法

为了解决这个问题,需要对代码和设置进行一些调整:

1. 检查 COM 端口设置

确保已正确设置 COM7 端口的波特率、奇偶校验、字符长度和停止位。验证设备是否正确连接到计算机。

2. 修改代码

  • handleDataReceived() 函数中,使用 trim() 函数移除字符串中的任何空白字符。
  • while 循环中,将 sleep() 函数的延迟从 5 秒增加到 30 秒。

代码示例

<?php
// 引入 PhpSerial 库
require_once('PhpSerial.php');

// 创建一个 PhpSerial 对象
$serial = new PhpSerial;

// 设置 COM 端口
$serial->deviceSet("COM7");

// 配置波特率、奇偶校验、字符长度和停止位
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("xon/xoff");

// 打开端口
if (!$serial->deviceOpen()) {
    die("无法打开端口。");
}

// 处理接收到的数据
function handleDataReceived($serial) {
    // 获取接收到的数据
    $data_rec = trim($serial->readPort());

    // 如果数据不为空,则打印数据
    if (!empty($data_rec)) {
        echo "新数据:" . $data_rec;
    } else {
        echo "COM 未接收数据。";
    }
}

// 设置循环时间为 30 秒
$interval = 30;

// 循环等待数据
while (true) {
    echo "等待数据...";
    handleDataReceived($serial);
    echo "等待 $interval 秒...";
    sleep($interval);
}

// 关闭端口
$serial->deviceClose();
?>

其他提示

  • 使用最新版本的 PhpSerial 类。
  • 在运行脚本之前,使用串行通信工具验证 COM 端口是否正在接收数据。
  • 如果仍然遇到问题,请尝试使用其他串行通信库。

常见问题解答

  1. 为什么我收到“COM 未收到数据”错误?
    这可能是由于端口设置不正确或设备未连接到计算机造成的。
  2. 如何增加循环时间?
    修改 $interval 变量以设置循环的持续时间。
  3. 我应该使用哪个串行通信库?
    PhpSerial 类是最常用的选项之一。
  4. 如何确定 COM 端口的正确设置?
    查看设备手册或使用串行通信工具进行测试。
  5. 为什么使用 trim() 函数?
    trim() 函数可移除字符串中的任何空白字符,以防止读取空行。

结论

通过遵循这些步骤,你应该能够成功使用 PHP Serial 类从 COM 端口读取数据。