2014-06-10 70 views
1

我能够发送数据给我的arduino,当我发送信息时,板子中间的LED闪烁。 完全相同的情况发生在我不发送消息时,只是打开并关闭串口。这可能意味着PhpSerial类没有发送消息,或者arduino设置不正确。Arduino没有收到串口信息

我的Arduino代码:

#include "USBSerial_main.h" 

int incomingByte = 0; 
int pin = 2; 

void setup() { 
    Serial.begin(9600); 
    pinMode(2, OUTPUT); 
    digitalWrite(2, false); 
} 

void loop() { 
    if(Serial.available() > 0){ 
     Serial.read(); 
     digitalWrite(2, true); 
     delay(100); 
     digitalWrite(2, false); 
    } 
} 

我的PHP代码:

<?php 

ini_set('display_errors', '1'); 
error_reporting(E_ALL); 
include "PhpSerial.php"; 

$msg = ''; 
$comPort = "/dev/ttyACM0"; 

if(isset($_POST["hi"])){ 
    $serial = new phpSerial; 
    $serial->deviceSet($comPort); 
    $serial->confBaudRate(9600); 
    $serial->confParity("none"); 
    $serial->confCharacterLength(8); 
    $serial->confStopBits(1); 
    $serial->deviceOpen(); 
    $serial->sendMessage("Well hello!"); 
    $serial->serialflush(); 
    $serial->deviceClose(); 
    $msg = "Your message has been sent!"; 
} 

?> 

<html> 
    <head> 
     <title>hi</title> 
    </head> 
    <body> 
     <form method="POST"> 
     <input type="submit" name="hi" value="Send"> 
     </form><br> 
     <?=$msg?> 
    </body> 
</head> 

我已经修改了PhpSerial.php文件,因为它没有检测stty命令,这实际上是可用,coreutils软件包完全是最新的。

我只是拿出这样的检查:

//if ($this->_exec("stty") === 0) { 
     register_shutdown_function(array($this, "deviceClose")); 
//} else { 
// trigger_error(
//  "No stty availible, unable to run.", 
//  E_USER_ERROR 
// ); 
//} 

到底哪里出问题了,什么办解决这一问题?它是否与PhpSerial的版本(我刚刚从几小时前从github直接拉出)或其他内容有关?

还有一个注意事项:它正在使用fopen来做这件事。

系统:在VBox中运行Ubuntu 14.02 LTS。

回答

2

您可能需要检查的一件事是,当您打开串行连接时,Arduino将重置,引导加载程序运行并需要一定量开始运行您自己的代码。在发送消息之前,您可能会尝试在deviceOpen之后添加1-2秒的延迟时间。

+0

谢谢你十几次,那有效!它需要准确的2秒的延迟,这对PHP应用程序来说是个好消息。但不管怎么说。有用! – rhbvkleef

0

由于rslite表示,这是引导加载程序用来检查重新编程请求的延迟时间。对于“生产”阶段的项目,每次通过串行连接时都会发现程序已重置,以查看发生了什么,这可能令人沮丧。特别是对于基于Web的应用程序,它将增加页面加载时间。

您可以禁用串行连接的自动重置(link)。有破坏性的和非破坏性的方法。我在这里复制了简单的非破坏性方法以供快速参考。如果你按照链接进行了更多的细节。

自动复位禁用

不需要的硬件或软件配置改变任何永久性的修改简单的方法:

棒120欧姆的电阻5V和复位的头文件(你可以找到这些也在isp连接器上)。 120很难找到,所以只需组合电阻。不要低于110欧姆或高于124欧姆,并且不要连接isp编程器。当你想要自动复位时,你可以拔出电阻。

也许增加一个开关或跳线,如果这是一个更永久的安排?或者你也许可以从你的arduino PCB上去掉一个电阻 - 在链接中可以找到它的细节。

重新编程,支持自动复位禁用

即使没有自动复位功能,它仍然是相当容易得到的代码上传。

  1. 按住复位按钮
  2. 修复你的眼睛上的RX/TX LED的PCB
  3. 按在IDE中上传按钮
  4. 尽快上的RX领导闪现一次,很快释放重置按钮

之后,正常的上传过程应该开始与RX/TX LED疯狂闪烁。如果IDE(或avrdude)引发错误,只需处理您的计时。我正在定期执行此操作,并且与当前的引导加载程序配合良好。