问题描述
我想知道是否有办法通过 PHP 完成读取我的串行端口 - 行得通:-)
I wonder if there is a way to accomplish reading my serial port via PHP - that works :-)
在练习我的 Arduino 技能时,我开发了一个简单的 LED 开/关草图.它的工作原理是在串行监视器中输入 on 或 off.
In practising my Arduino skills, I developed a simple LED ON/OFF sketch. It works by entering on or off in the serial monitor.
下一步,我将一个网页放在一起作为 GUI 界面来单击链接并执行上面的打开和关闭功能.这个基于 Web 的 GUI 通过 PHP 工作.我正在使用 PHP SERIAL 类与我的 Arduino 使用的串行端口进行交互.
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. This webbased GUI works via PHP.I am using the PHP SERIAL class to interact with the serial port my Arduino is using.
问题是我需要找到一种从串口获取反馈的方法.使用 Arduino IDE 串行监视器,我可以看到响应我的每个串行输入的打印消息,我需要在我的 PHP 代码中检索相同的反馈.
PHP Serial 类提供了一个 readPort() 函数,但我不返回我的数据.
The PHP Serial class offers a readPort() function but I does not return my data.
更新[2]:
阿杜诺:
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
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}";
}
}
}
?>
推荐答案
我假设您在 linux 上工作.
I assume you work on linux.
首先设置你的串口:
stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
然后你可以使用好的老式 fread/fwrite
Then you can use good old fashion fread/fwrite
$fp =fopen("/dev/ttyACM0", "w+");
if( !$fp) {
echo "Error";die();
}
fwrite($fp, $_SERVER['argv'][1] . 0x00);
echo fread($fp, 10);
fclose($fp);
你只需要记住一件事.Arduino 将在每次连接时重新启动.如果你不知道它会让你感到困惑.例如,如果您连接 (fopen) 并立即发送数据,Arduino 将错过它,因为它正在启动(需要一两秒).尝试睡眠,给它一些时间.如果您想禁用重启,请使用从 GRD 到 RST 的 10uF 电容器.
There is only one thing you have to remember. Arduino will restart on every connection. 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). Experiment with sleep to give it some time. If you want to disable restarting use 10uF capacitor from GRD to RST.
祝你好运
ps.您可以使用屏幕"进行故障排除
ps. you can troubleshoot with "screen"
screen /dev/ttyACM0 9600
关于使用 Arduino 设置 PHP 的帖子 http://systemsaritect.net/connecting-php-with-arduino-via-serial-port-on-linux/ 和这里还有一个 http://systemsaritect.net/arduino-and-php-serial-communication-with-a-protocol/.
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/.
这篇关于PHP串口数据从Arduino返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!