2

OpenWrtファームウェアを使用して、TP-Link MR3420ルーターのUSBインターフェイス経由でArduino Unoを制御するPHP Webインターフェイスを作成しようとしています

奇妙なことに、私の PHP スクリプトは、arduino と通信する python スクリプトを実行した後にのみ arduino から応答を得ます。

私のPHPスクリプトはarduinoのLEDをオフにすることができたので動作していると確信していますが、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);

4

3 に答える 3

3

問題の真の原因を発見!

phpSerial クラス:

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

と置換する:

$ret = $this->_exec("stty -F " . $this->_device . " raw speed " . (int) $rate, $out);
于 2012-08-02T12:58:20.323 に答える
0

rc.local ファイルでこの行を使用して、何かを実行する前にポートを設定します。

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

2 つの追加フラグが便利です: -echo は、すべての出力を入力にエコーバックする OpenWRT/USB の習慣をオフにします -hupcl は、各送信後に hup を送信しないことで自動リセットの問題をオフにします

ここでも YMMV - 文字列や複雑なデータではなく、単一バイトを送受信しています

于 2013-01-26T12:02:23.870 に答える
0

Arduinoには、シリアル接続の問題に関する文書化された自動リセットがあります。私の最初の推測では、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
于 2012-08-01T04:29:01.527 に答える