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)有串口设备的访问权限,你可以通过以下命令检查并设置:
- 查看串口设备的所属组:
ls -l /dev/cu.usbmodem14101 - 将
_www加入对应组:sudo dscl . append /Groups/<组名> GroupMembership _www
内容的提问来源于stack exchange,提问作者Nikolai S
相关产品推荐
相关产品推荐

