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

PHP与Arduino Mega串口通信控制LED异常:触发旧LED而非目标LED

问题描述

我想用PHP代码点亮Arduino Mega的LED引脚,目前用PhpSerial库实现串口通信,但运行后没点亮目标LED,反而触发了之前的LED。Arduino端代码单独在IDE里上传运行是正常的,以下是我写的代码:

PHP代码

<?php
include 'PhpSerial.php';
class ArduinoCommunication
{
    private $serial;

    public function __construct($port, $baudRate)
    {
        $this->serial = new PhpSerial();
        $this->serial->deviceSet($port);
        $this->serial->confBaudRate($baudRate);
        $this->serial->confParity("none");
        $this->serial->confCharacterLength(8);
        $this->serial->confStopBits(1);
        $this->serial->deviceOpen("w");
        $this->serial->deviceOpen();
    }

    public function turnOnLED()
    {
        $this->sendCommand(1);
    }

    public function turnOffLED()
    {
        $this->sendCommand('0');
    }

    private function sendCommand($command)
    {
        $this->serial->sendMessage($command);
    }

    public function closeConnection()
    {
        $this->serial->deviceClose();
    }
}

$arduinoPort = 'COM3';
$baudRate = 9600;

$arduino = new ArduinoCommunication($arduinoPort, $baudRate);

$arduino->turnOnLED();
sleep(2); // Wait for 2 seconds

$arduino->closeConnection();
?>

Arduino代码

byte led = A5;

void setup() {
    pinMode(led, OUTPUT);
    Serial.begin(9600);     

    digitalWrite(led,HIGH);
    delay(500);
    digitalWrite(led,LOW);
    delay(500);
    digitalWrite(led,HIGH);
    delay(500);
    digitalWrite(led,LOW);
}

void loop() {
}
解决方案

1. 修复Arduino代码核心问题

当前Arduino代码仅在setup()阶段让LED闪烁三次,后续loop()为空,完全没有处理串口接收的指令,PHP发送的控制命令根本没被识别执行。修改代码,让Arduino在loop()中监听串口指令:

byte led = A5;

void setup() {
    pinMode(led, OUTPUT);
    Serial.begin(9600);     
    // 保留初始化闪烁,确认硬件正常
    digitalWrite(led,HIGH);
    delay(500);
    digitalWrite(led,LOW);
    delay(500);
    digitalWrite(led,HIGH);
    delay(500);
    digitalWrite(led,LOW);
}

void loop() {
    // 检查是否有串口数据
    if (Serial.available() > 0) {
        char cmd = Serial.read(); // 读取命令字符
        if (cmd == '1') {
            digitalWrite(led, HIGH); // 点亮LED
        } else if (cmd == '0') {
            digitalWrite(led, LOW); // 熄灭LED
        }
    }
}

2. 修复PHP代码问题

  • 删除重复串口打开操作:构造函数中连续调用了两次deviceOpen(),会导致资源冲突,保留其中一次即可(建议保留deviceOpen("w")或使用无参默认模式)。
  • 统一命令格式:turnOnLED()传的是整数1,turnOffLED()传的是字符串'0',统一改成字符串避免数据格式混乱:
public function turnOnLED()
{
    $this->sendCommand('1');
}
  • 增加连接延迟:Arduino串口连接时会自动重启,需给足初始化时间,否则PHP发送命令时设备未就绪。在构造函数打开串口后添加延迟:
public function __construct($port, $baudRate)
{
    $this->serial = new PhpSerial();
    $this->serial->deviceSet($port);
    $this->serial->confBaudRate($baudRate);
    $this->serial->confParity("none");
    $this->serial->confCharacterLength(8);
    $this->serial->confStopBits(1);
    $this->serial->deviceOpen("w");
    // 等待Arduino重启完成
    sleep(2);
}

3. 额外排查点

  • 确认Arduino的串口端口COM3正确(可在Arduino IDE的工具菜单中查看)。
  • 检查PhpSerial库安装是否完整,运行PHP脚本的权限是否足够(Windows需管理员权限,Linux需加入dialout组)。
  • 验证LED接线是否正确:A5引脚需串联电阻后连接LED负极,LED正极接Arduino 5V或3.3V引脚。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:59:55