我试图让一个基于网页的串行通信与连接到运行 Openwrt 的路由器的 Arduino 一起工作,它确实有效,但只有当屏幕正在运行或通过腻子远程连接时,由于某种原因,php 到串行不是正确开始会话?我使用 ser2net 通过以下设置管理串行
1000:raw:0:/dev/ttyACM0:9600
我也尝试过 stty 在这个论坛上建议的各种设置
更新 1
还尝试80:raw:0:/dev/ttyACM0:9600
作为 ser2net 的设置,假设端口 80 是 web/http 端口
我的 php 代码是
if (isset($_GET['action']))
{
$serial = new phpSerial();
$serial->deviceSet('/dev/ttyACM0');
$serial->confBaudRate(9600);
$serial->confParity('none');
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl('none');
$serial->deviceOpen();
if ($_GET['action'] == "PIN_12_HIGH")
{
$serial->sendMessage("A");
}
if ($_GET['action'] == "PIN_12_LOW")
{
$serial->sendMessage("B");
}
if ($_GET['action'] == "PIN_11_HIGH")
{
$serial->sendMessage("C");
}
if ($_GET['action'] == "PIN_11_LOW")
{
$serial->sendMessage("D");
}
$serial->deviceClose();
}
更新 2
如果我添加sleep(1);
到我的 php 代码中,它似乎可以解决一些问题
几点
- 在 php 代码中添加睡眠允许命令在由串行连接引起的重置后到达 arduino,但是如果我在打开 led 2 时打开 led 1,则 led 1 会重置为关闭。所以这意味着更复杂的代码以记录一系列选择并将整个更新的数组发送到 arduino 的形式,我想避免这种情况,一次只发送 1 个命令。
- 再次当屏幕或腻子处于活动状态时,arduino 没有这个重置问题?所以问题是screen和putty做了什么来保持stty和php serial不存在的连接?
更新 3
在找到这篇有用的帖子后,我似乎发现了一个可能的解决方案,而无需对 Arduino 进行重置黑客攻击。添加cat /dev/ttyACM0 &
到 Openwrt 路由器的启动配置中,可以与 Arduino 进行串行通信,而无需在每次传输数据时重置它。
遗留问题:
- 我认为这段代码将 arduino 绑定到与路由器的会话?但我不确定。
- 它似乎正在吃来自 Arduino 的返回值,阻止我的 php 页面获取数据返回?
- 我的系统日志文件包含 Arduino 丢失的返回数据?
更新 4
- 由于我需要让它工作,我使用了一个电容器来阻止 arduino 上的串行通信自动复位。
- 如前所述,屏幕和油灰在与 arduino 通信时不会产生此重置问题,我尝试了许多不同的 STTY 设置但找不到解决方案,但我仍在尝试并热衷于发现屏幕/油灰是如何做到这一点的。