php - 通过 USB 从 Mac 网络服务器对 Arduino 进行问题控制
问题描述
我想要实现的是通过串行接口控制 Arduino。它只在一定程度上起作用。
我正在使用 Arduino Uno R3 和带有 Mojave (10.14.6)、Apache 版本 2.4.34 和 PHP 版本 7.1.23 的 Mac。
我从这个简单的项目开始:
https://www.instructables.com/id/Control-LED-Using-Serial-Monitor/,
它工作正常。我可以通过在我的 Mac 上的 Arduino 应用程序的串行输入中键入 1 和 2 来关闭和打开 LED。现在我想在同一台 Mac 上设置的网络服务器上做同样的事情。我尝试了两种不同的方法来做到这一点。通过此处找到的 PhpSerial 库访问串行接口:
https://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html ,
或通过在命令行中回显信号(1 或 2)。两者都不起作用。在 PHP 文件中,我放置了以下代码:
<?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();
if($_GET["led"] == "ON")
$serial->sendMessage(1);
if($_GET["led"] == "OFF")
$serial->sendMessage(2);
}
?>
它导致 LED 随机闪烁,我将其解释为 Arduino 或正在设置的串行,但是当我尝试通过<form>
PHP 文件中的元素这样做时,LED 没有打开或关闭。会不会是串口设置错了?现在我想通过在 PHP 中运行 shell 命令来解决问题。通过运行
screen /dev/cu.usbmodem14101
在终端(手动,而不是通过 PHP)中,我能够通过串行接口访问 Arduino,并成功地打开和关闭 LED,就像我在 Mac 上的 Arduino-app 的串行接口中所做的那样。但是,我无法找出如何使用 PHP 中的 screen 命令。所以我想我可以像这样通过串行接口向 Arduino 回显命令
echo 1 > /dev/cu.usbmodem14101
这会产生与 PhpSerial 相同的结果。LED 会随机闪烁,但是当我向串口发送一个和两个时它不会打开或关闭。由于我无法让它在终端中工作,我还没有尝试在 PHP 中运行命令。
我错过了什么?
编辑:
我已经取得了一些进展。通过使用cat
打开和关闭 LED 的命令并将其放在单独的文件中,我可以将命令连接到串行端口。我有一个on.txt
仅包含数字 1 的文件,以及另一个off.txt
包含数字 2 的文件。通过运行命令
cat on.txt > /dev/cu.usbmodem14101
和
cat off.txt > /dev/cu.usbmodem14101
我能够打开和关闭 LED。我也可以将文本文件放在网页项目的根文件夹中,然后从 php 运行命令
<?php
if(isset($_GET["submit"])){
if($_GET["led"] == "ON")
exec("cat on.txt > /dev/cu.usbmodem14101");
if($_GET["led"] == "OFF")
exec("cat off.txt > /dev/cu.usbmodem14101");
}
?>
<h1>Turn LED on or off</h1>
<p>LED turned <?php echo $_GET["led"]; ?></p>
<form action="led.php" method="GET">
<input type="radio" name="led" value="ON" <?php if($_GET["led"]=="ON") echo "checked"; ?> > On <br />
<input type="radio" name="led" value="OFF" <?php if($_GET["led"]=="OFF") echo "checked"; ?> > Off <br />
<input type="submit" name="submit" value="Execute">
</form>
现在我完成了我尝试做的事情,但是我可以运行其他命令来将 1 和 2 直接定向到串行端口,而不是使用文本文件吗?
解决方案
经过更多测试后发现,通过串口与 Arduino 的连接仅在串口被监控时才有效。当我使用cat
编辑中提到的解决方案时,我使用命令在单独的终端窗口中监视串行
cat /dev/cu.usbmodem14101
我在最初的测试中没有这样做
echo 1 > /dev/cu.usbmodem14101
我使用的 sceen 命令是监控串行,以及我找到的另一个解决方案并且有效
sudo cu -s 9600 -l /dev/cu.usbmodem14101
所以在我看来,结论是我必须cat /dev/cu.usbmodem14101
在单独的终端窗口中运行命令。然后我可以以任何首选的方式输出到串行端口,从另一个终端窗口,通过 PhpSerial 库或简单地exec("echo 1 > /dev/cu.usbmodem14101");
在 PHP 中。我现在使用的代码如下:
<?php
if(isset($_GET["submit"])){
if($_GET["led"] == "ON")
exec("echo 1 > /dev/cu.usbmodem14101");
if($_GET["led"] == "OFF")
exec("echo 2 > /dev/cu.usbmodem14101");
}
?>
推荐阅读
- php - 使用 UploadFileInterface 上传图片
- android - 将图像移动到布局的中心
- google-chrome-extension - Chrome 扩展 - 沙盒页面如何访问存储中的数据?
- mysql - 尝试在不存在的地方插入数据抛出:#1242 - 子查询返回超过 1 行
- delphi - Indy Header Last-Modified - 日期编码的参数无效
- react-native - React Native 地理位置权限回调
- python - 如何使用 tensorflow 的权重制作 MLP
- php - 从多维数组 PHP 中搜索和检索
- entity-framework - 在没有 ModelState.IsValid 的情况下检查模型是否有效
- c++ - 如何在 Google Test 中的公共方法使用的类中模拟私有方法?