首页 > 解决方案 > 从树莓派网络服务器发送 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 是否有效。

标签: javascriptphpraspberry-piwebservercan-bus

解决方案


推荐阅读