2012-07-31 56 views
2

我试图创建一个web界面使用的OpenWrt固件通过TP-Link的路由器MR3420的USB接口来控制Arduino的乌诺串行连接。错误?

奇怪的是,我的PHP脚本只能在运行一个python脚本后,得到的答复的Arduino与Arduino的沟通

我敢肯定,我的PHP脚本工作,因为它能够关闭LED灯上的Arduino,但仍没有得到Arduino的

这里回复我的PHP代码:

require("lib/php_serial.class.php"); 

$serial = new phpSerial; 

$serial->deviceSet("/dev/ttyACM0"); 
$serial->confBaudRate(9600); 

$serial->deviceOpen(); 
$serial->sendMessage($cmd); 
sleep(1); 
$read = $serial->readPort(); 
$serial->deviceClose(); 

这里是我的Arduino素描:

int numSerial; 
if (Serial.available() > 0) 
{ 
char inByte = Serial.read(); 
switch (inByte) 
{ 
case 'l': 
    numSerial = numberFromSerial(); 
    if (numSerial >= 0) 
    { 
    Serial.print("LED Mode: "); 
    switch (numSerial) 
    { 
    case 0: 
     ledMode = 0; 
     Serial.print("OFF"); 
     break; 
    case 1: 
     ledMode = 1; 
     Serial.print("TEMP"); 
     break; 
    case 2: 
     ledMode = 2; 
     Serial.print("KR"); 
     break; 
    } 
    } 
    else 
    Serial.print(ledMode); 
    break; 
case 't': //Data request 
    Serial.print(getTemp()); 
    break; 
} 
} 

这里是我的Python代码:

import serial 
ser = serial.Serial("/dev/ttyACM0", 9600, timeout=3) 
ser.open() 
ser.write("t") 
print ser.readline() 
ser.close() 

请帮助。 谢谢。

发现问题的真正根源!

在phpSerial类:

$ret = $this->_exec("stty -F " . $this->_device . " " . (int) $rate, $out);

替换:

$ret = $this->_exec("stty -F " . $this->_device . " raw speed " . (int) $rate, $out);

+0

解决了! 在每个路由器启动时运行“stty -F/dev/ttyACM0 raw speed 115200”解决了我的问题 – gutzz 2012-08-02 07:43:41

+1

如果你解决了你自己的问题,你应该发布解决方案作为答案并接受它。 – 2012-08-02 12:34:39

+0

会做。谢谢。 – gutzz 2012-08-02 12:58:47

回答

2

发现问题的真正根源!

在phpSerial类:

$ret = $this->_exec("stty -F " . $this->_device . " " . (int) $rate, $out); 

替换:

$ret = $this->_exec("stty -F " . $this->_device . " raw speed " . (int) $rate, $out); 
0

Arduino的有记录的Auto Reset on Serial Connection问题。我的第一个猜测是,您使用的PHP代码触发这个(这就是为什么灯都关掉,但你没有收到任何回应后)。

尝试使用从上面的链接的解决方法之一。

这里是一个Perl代码片断,你可以用它来看看是否你实际上是触发这一问题。

#!/usr/bin/perl 
use strict; 
use Device::SerialPort; 
my $port = Device::SerialPort->new("/dev/ttyUSB0"); 
$port->databits(8); 
$port->baudrate(9600); # <-- match to arduino settings 
$port->parity("none"); 
$port->stopbits(1); 
$port->dtr_active(0); //toggle this to one to trigger reset 
+1

已使用自定义固件从以下位置禁用了自动重置:http://www.tinkerin.gs/2011/03/arduino-auto-reset-software-fix.html 但仍无法从arduino回复 – gutzz 2012-08-01 05:14:16

+0

+1 Nice,I不知道那个 – ZnArK 2012-08-02 21:11:58

0

我用这条线在我的rc.local文件中的端口设置运行任何东西之前。

stty -F /dev/ttyUSB0 raw speed 38400 -echo -hupcl 

两个附加标志是有用的: -echo关闭上-hupcl由每个传输之后不发送HUP关闭自动复位问题的输入 呼应每个输出背部的OpenWRT/USB习惯

有再次因人而异 - 我的发送和接收单字节而不是字符串或复杂的数据