javascript - 从树莓派网络服务器发送 CAN-BUS 消息
问题描述
我们正在建造一个应该通过网络控制的流动站。它由十几个拆分工作的arduino组成。一个专用于语音命令和文本转语音,两个用于控制一系列超声波传感器,等等。
为了广播消息,以便其他元素可以读取和使用他们需要的任何信息,我们决定使用 can-bus 系统。问题出在接口和pi的can-hat之间。
工作: - 具有 php 内置接口的 Pi 网络服务器:可访问且工作。- 名为 can_send 的 Pi c 文件可执行文件接收两个参数(id 和消息)并驱动 can-hat。- Arduino can reader,一种通用的arduino,可以在我们的PC串行监视器上输出它接收到的can消息。它可以工作,并且通过在 Pi 上启动 can_send 可以获取正确的信息。
不工作: - 从网络服务器,中间没有刷新或页面,我们应该单击一个按钮并执行 can_send 脚本。
我们最初的想法是这样的:PHP 界面 -> 按钮 onclick -> javascript 函数 -> 执行 shell_exec 的 PHP 文件。
我们现在被打动了。不知道我们是在挖坟墓还是离成功更近了一步。
网页界面上的按钮:
<button style='width: 100px; height: 100px;background: url(./design/images/right.png)' onclick='cantxedx()' />
javascript函数(在网页顶部声明)
function cantxedx() {
var x = new XMLHttpRequest();
x.open("GET", "../SCRIPTS/can_transmission.php?id=15&msg=001" + document.getElementbyId('myRangeThr'), true);
x.send();
return false;
}
</script>
can_transmission.php 如下:
//can_transmission.php
$TXmsgid= $_GET['id'];
$TXmsg= $_GET['msg'];
//formattazione stringa
$wordsize = sizeof($TXmsg);
if($wordsize<8)
{
while($wordsize<8)
{
$TXmsg= $TXmsg . "0";
$wordsize = sizeof($TXmsg);
}
}
if($wordsize>8)
{
//placeholder for building long messages
}
$TXstring= "sudo /var/www/html/SCRIPTS/c/can_send ".$TXmsgid." ".$TXmsg;
$handle = fopen("log.txt", "a+");
fwrite($handle, $TXstring);
fclose($handle);
shell_exec($TXstring);
?>
还有一个滑块,用于设置 can-message 的最后一部分的值
<div align='center'>
<p>THROTTLE</p>
</div>
<div class='slidecontainerv'>
<input type='range' min='5' max='100' step='5' value='50' class='sliderv' id='myRangeThr' orient='vertical' width='500'>
</div>
<div align='center'>
<p>Value: <span id='throttle'></span>%</p>
</div>
这个想法是:当单击 html 按钮时,执行所需的 javascript 函数。
在这个函数中,我们调用一个传输文件,传递我们需要的信息(消息的 id,与 msg 的前几个数字中按下的按钮相关的一些信息,以及从滑块读取的另一个值)
传输文件驱动 can-hat,然后消息被 arduino 排读取和使用。
按钮和传输文件之间的某处无法正常工作。单击按钮时,没有任何反应,没有新的 can-bus 消息,也没有新的日志行。
新信息
我们整理了一些东西:在我们添加的 HTML 按钮中
onclick='cantxebw(\"010\")
这使我们能够减少 javascript 功能(不是每个按钮一个)。在 javascript 中,我们收集了信息,我们得到:
function cantxebw(jdir) {
var jid = '10';
var slider = document.getElementById('myRangeThr');
var vt = slider.value;
var vtx = jid + jdir + vt;
alert(vtx);
$.ajax({
url: '../SCRIPTS/can_transmission.php',
type: 'POST',
data: {'id':'jid', 'msg':'vtx'},
success: function(data) {
console.log(data); // Inspect this in your console
}
});
};
</script> ";
此时,一旦单击按钮,我们就会有一个警报窗口,其中会根据需要打印出正确的值。问题是: - ajax 函数不调用 php 脚本或不发送值(我们尝试了一个简单的表单,在 can_transmission 上使用相同的值和 $_POST 并且它有效)。
即使使用这种形式,我们也无法通过 shell exec 进行操作(通过控制台,脚本 can_send 可以工作,但不能使用 shell_exec)。在这里,我们尝试使用 fileexist 查看路径是否正确,并且使用完整路径或相对路径的 bot 是否有效。
解决方案
推荐阅读
- c# - 以编程方式将多个标签添加到 WPF 网格
- clang - 如何使用 llvm 运行 clang 的 AST
- c# - 尽管没有调试错误 (C#),Visual Studio Code 也不会编译到 Unity
- dsl - 是否可以更改 Xtext 中语法规则/对象之间交叉引用的关键字?
- windows - 如何为所有公司用户进行 Windows 通知
- php - 如何在 laravel 中使用 kreait/firebase 云消息向多个设备发送推送通知
- jquery - 从排序列表的第一个元素中获取值
- javascript - 按顺序运行类实例的方式(typescript nodejs)
- javascript - 选择文件时Javascript调整图像大小并上传新图像而不是原始图像
- flutter - 如何从小部件树中的多个小部件中重绘特定小部件