简体   繁体   English

从Arduino返回PHP串口数据

[英]PHP serial port data return from Arduino

I wonder if there is a way to accomplish reading my serial port via PHP - that works :-) 我想知道是否有办法通过PHP完成阅读我的串口 - 工作原理:-)

In practising my Arduino skills, I developed a simple LED ON/OFF sketch. 在练习我的Arduino技能时,我开发了一个简单的LED ON / OFF草图。 It works by entering on or off in the serial monitor. 它通过在串行监控进入 关闭

Next step, I put together a webpage to act as an GUI interface to click a link and perform the on and off function above. 下一步,我将一个网页放在一起作为GUI界面,点击链接并执行上面的开启和关闭功能。 This webbased GUI works via PHP. 这个基于Web的GUI通过PHP工作。 I am using the PHP SERIAL class to interact with the serial port my Arduino is using. 我正在使用PHP SERIAL类与我的Arduino正在使用的串口进行交互。

The issue is I need to find a way of getting feedback from the serial port. 问题是我需要找到一种从串口获取反馈的方法。 Using the Arduino IDE serial monitor, I can see my printed messages in response to each of my serial input and I need to retrieve the same feedback in my PHP code. 使用Arduino IDE串行监视器,我可以看到我的打印消息以响应我的每个串行输入,我需要在我的PHP代码中检索相同的反馈。

The PHP Serial class offers a readPort() function but I does not return my data. PHP Serial类提供了readPort()函数,但我没有返回我的数据。

UPDATE[2]: UPDATE [2]:

ARDUINO: ARDUINO:

const int greenPin = 2;
const int bluePin = 3;
const int redPin = 4;

int currentPin = 0; //current pin to be faded
int brightness = 0; //current brightness level

void setup(){
  Serial.begin(9600);

  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(redPin, OUTPUT);
}

void loop(){
  //if there's any serial data in the buffer, read a byte
  if( Serial.available() > 0 ){
    int inByte = Serial.read();

      //respond only to the values 'r', 'g', 'b', or '0' through '9'
      if(inByte == 'r')
        currentPin = redPin;

      if(inByte == 'g')
        currentPin = greenPin;

      if(inByte == 'b')
        currentPin = bluePin;

      if(inByte >= '0' && inByte <= '9'){
        //map the incoming byte value to the range of the analogRead() command
        brightness = map(inByte, '0', '9', 0, 255);
        //set the current pin to the current brightness:
        analogWrite(currentPin, brightness);
      }

      Serial.print("Current Pin : ");
      Serial.println(currentPin);

      Serial.print("Brightness : ");
      Serial.println(brightness);

  }//close serial check

}

PHP/HTML: PHP / HTML:

<?php
    require("php_serial.class.php");
// include("php_serial.class.php");

    // Let's start the class
    $serial = new phpSerial();

    // First we must specify the device. This works on both Linux and Windows (if
    // your Linux serial device is /dev/ttyS0 for COM1, etc.)
    $serial->deviceSet("/dev/ttyACM0");

    // Set for 9600-8-N-1 (no flow control)
    $serial->confBaudRate(9600); //Baud rate: 9600
    $serial->confParity("none");  //Parity (this is the "N" in "8-N-1")
    $serial->confCharacterLength(8); //Character length     (this is the "8" in "8-N-1")
    $serial->confStopBits(1);  //Stop bits (this is the "1" in "8-N-1")
    $serial->confFlowControl("none");

    // Then we need to open it
    $serial->deviceOpen();

    // Read data
    $read = $serial->readPort();
print "<pre>";
print_r($read);
print "</pre>";

    // Print out the data
    echo $read;
        // print exec("echo 'r9g9b9' > /dev/ttyACM0");
    print "RESPONSE(1): {$read}<br><br>";

    // If you want to change the configuration, the device must be closed.
    $serial->deviceClose();
?>

<?php
    if( isset($_REQUEST['LED']) )
        response();
?>

<form action='index.php' method='POST'>
    <select id='led' name='LED'>
        <option id='nil'>-</option>
        <option id='red'>RED</option>
        <option id='green'>GREEN</option>
        <option id='blue'>BLUE</option>
        <option id='all'>ALL</option>
    </select>
    <input type='submit' value='SET'>
</form>

<?php
    print "Hi, Earthlings!";

    function response(){
        $CMDString = "";
        $execute   = false;

        if( isset($_REQUEST['LED']) ){
                switch ($_REQUEST['LED']) {
                    case 'RED':
                        $CMDString = 'r9';
                        $execute = true;

        exec("echo 'r9g0b0' > /dev/ttyACM0");

                print "<br>FOUND: {$_REQUEST['LED']}";
                        break;
                    case 'GREEN':
                        $CMDString = 'g9';
                        $execute = true;
                print "<br>FOUND: {$_REQUEST['LED']}";
                        break;
                    case 'BLUE':
                        $CMDString = 'b9';
                        $execute = true;
                print "<br>FOUND: {$_REQUEST['LED']}";
                        break;
                    case 'ALL':
                        $CMDString = 'r9g9b9';
                        $execute = true;
                print "<br>FOUND: {$_REQUEST['LED']}";
                        break;
                    default:
                        print exec("echo 'r0g0b0' > /dev/ttyACM0");
                        $execute = false;
                        break;
                }

                if($execute){
                    print exec("echo '{$CMDString}' > /dev/ttyACM0");
                    print "<br><br>executing: {$CMDString}";
                }
        }
    }
?>

I assume you work on linux. 我假设你在linux上工作。

First setup your serial port: 首先设置您的串口:

stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

Then you can use good old fashion fread/fwrite 然后你可以使用良好的旧时尚fread / fwrite

$fp =fopen("/dev/ttyACM0", "w+");
if( !$fp) {
        echo "Error";die();
}

fwrite($fp, $_SERVER['argv'][1] . 0x00);
echo fread($fp, 10);

fclose($fp);

There is only one thing you have to remember. 你必须记住一件事。 Arduino will restart on every connection . Arduino将在每个连接上重启 If you don't know that It will confuse you. 如果你不知道它会让你感到困惑。 For instance if you connect (fopen) and instantly send data Arduino will miss it because it's booting (which takes a sec or two). 例如,如果您连接(fopen)并立即发送数据,Arduino将错过它,因为它正在启动(需要一两秒钟)。 Experiment with sleep to give it some time. 试试睡眠给它一些时间。 If you want to disable restarting use 10uF capacitor from GRD to RST. 如果要禁用重启,请使用从GRD到RST的10uF电容。

Good luck 祝好运

ps. PS。 you can troubleshoot with "screen" 你可以用“屏幕”进行故障排除

screen /dev/ttyACM0 9600

Post about setting PHP with Arduino http://systemsarchitect.net/connecting-php-with-arduino-via-serial-port-on-linux/ and one more here http://systemsarchitect.net/arduino-and-php-serial-communication-with-a-protocol/ . 关于使用Arduino设置PHP的帖子http://systemsarchitect.net/connecting-php-with-arduino-via-serial-port-on-linux/以及另外一个http://systemsarchitect.net/arduino-and-php-串行通信与协议/

/dev/ttyUSB0 running with user root, if your using apache try chown /dev/ttyUSB0 to apache or user is logged in. / dev / ttyUSB0用户root运行,如果你使用apache尝试chown / dev / ttyUSB0到apache或用户登录。

$ sudo chown apache2:apache2 /dev/ttyACM0
OR
$ sudo chown yourusername:yourusername /dev/ttyACM0

and then try again, or try logout from ubuntu and login as root user. 然后再试一次,或尝试从ubuntu注销并以root用户身份登录。

You are probably trying to read when is no data on the serial port. 您可能正在尝试读取串行端口上没有数据的时间。 You need to implement JavaScript code to call PHP code that can read at regular intervals. 您需要实现JavaScript代码来调用可以定期读取的PHP代码。

When you have got data, you should process it. 获得数据后,您应该处理它。

readPort() has worked fine for me. readPort()对我来说很好。 If the baud rate, parity, etc. is adjusted properly, then you should not have any problem reading the serial port. 如果正确调整了波特率,奇偶校验等,则读取串口时不应该有任何问题。

Here is a sample of using the library for Arduino. 以下是使用Arduino库的示例。 It worked for me some time ago: 它不久前对我有用:

<?php
    include "php_serial.class.php";

    // Let's start the class
    $serial = new phpSerial();

    // First we must specify the device. This works on both Linux and Windows (if
    // your Linux serial device is /dev/ttyS0 for COM1, etc.)
    $serial->deviceSet("/dev/ttyUSB0");

    // Set for 9600-8-N-1 (no flow control)
    $serial->confBaudRate(9600); //Baud rate: 9600
    $serial->confParity("none");  //Parity (this is the "N" in "8-N-1")
    $serial->confCharacterLength(8); //Character length     (this is the "8" in "8-N-1")
    $serial->confStopBits(1);  //Stop bits (this is the "1" in "8-N-1")
    $serial->confFlowControl("none");

    // Then we need to open it
    $serial->deviceOpen();

    // Read data
    $read = $serial->readPort();

    // Print out the data
    echo $read;

    // If you want to change the configuration, the device must be closed.
    $serial->deviceClose();
?>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM