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

Mac端Web服务器通过USB控制Arduino LED的问题求助

解决PHP直接向Arduino串口发送指令的问题

我来帮你搞定这个不用中间文件直接控制串口的需求,先分析下你之前遇到的问题根源,再给你两个可行的解决方案:

问题根源分析

你之前用echo 1 > /dev/cu.usbmodem14101出现随机闪烁,核心原因是**echo默认会在输出末尾添加换行符**,而你的Arduino代码应该是监听单个字符(1或2),额外的换行符会被当成无效指令干扰设备,导致异常。

至于PhpSerial库失效,主要是因为Arduino Uno在串口连接建立时会自动重启,你刚打开串口就发指令,设备还没完成初始化,指令直接丢失了。


方案1:改进Shell命令直接发送纯字符

用echo -n参数去掉默认的换行符,直接发送纯"1"或"2",和你用文本文件的效果完全一致:

<?php
if(isset($_GET["submit"])){
    $serialDevice = "/dev/cu.usbmodem14101";
    switch($_GET["led"]){
        case "ON":
            // -n 参数确保只发送纯字符,不带换行
            exec("echo -n '1' > $serialDevice");
            break;
        case "OFF":
            exec("echo -n '2' > $serialDevice");
            break;
    }
}
?>
<h1>Turn LED on or off</h1>
<p>LED turned <?php echo isset($_GET["led"]) ? $_GET["led"] : "not set"; ?></p>
<form action="led.php" method="GET">
    <input type="radio" name="led" value="ON" <?php if(isset($_GET["led"]) && $_GET["led"]=="ON") echo "checked"; ?> > On <br />
    <input type="radio" name="led" value="OFF" <?php if(isset($_GET["led"]) && $_GET["led"]=="OFF") echo "checked"; ?> > Off <br />
    <input type="submit" name="submit" value="Execute">
</form>

方案2:修复PhpSerial库的使用逻辑

如果想回到PhpSerial库的方案,只需要增加重启延迟,确保设备初始化完成后再发指令:

<?php
include 'PhpSerial.php';

$serial = new PhpSerial;
$serial->deviceSet("/dev/cu.usbmodem14101");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");

if(isset($_GET["submit"])){
    $serial->deviceOpen();
    // 关键:等待Arduino重启完成(Uno串口连接时会自动复位,需要2-3秒初始化)
    sleep(2);
    
    if($_GET["led"] == "ON") {
        // 发送字符串"1",而非数字1,确保ASCII字符正确
        $serial->sendMessage("1");
    }
    if($_GET["led"] == "OFF") {
        $serial->sendMessage("2");
    }
    
    // 等待指令完全发送
    usleep(100000);
    $serial->deviceClose();
}
?>
<h1>Turn LED on or off</h1>
<p>LED turned <?php echo isset($_GET["led"]) ? $_GET["led"] : "not set"; ?></p>
<form action="led.php" method="GET">
    <input type="radio" name="led" value="ON" <?php if(isset($_GET["led"]) && $_GET["led"]=="ON") echo "checked"; ?> > On <br />
    <input type="radio" name="led" value="OFF" <?php if(isset($_GET["led"]) && $_GET["led"]=="OFF") echo "checked"; ?> > Off <br />
    <input type="submit" name="submit" value="Execute">
</form>

额外注意事项

确保Apache的运行用户(Mac上通常是_www)有串口设备的访问权限,你可以通过以下命令检查并设置:

  1. 查看串口设备的所属组:ls -l /dev/cu.usbmodem14101
  2. 将_www加入对应组:sudo dscl . append /Groups/<组名> GroupMembership _www

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:02:31