ID:               49976
 Comment by:       stash_85 at hotmail dot com
 Reported By:      rpiccini at software4u dot it
 Status:           Open
 Bug Type:         Feature/Change Request
 Operating System: WIN XP / UBUNTU 9.04
 PHP Version:      5.2.11
 New Comment:

I also have the same problem trying to connect to a gprs modem via
serial port.

I can send commands using fputs but the script hangs while trying to
read from the resource using fgets, fread or stream_get_contents...

I think the problem, at least in my case, is that the response doesn't
have an end or something and the fact that the reading limit doesn't
work in this case.

The strange thing in my case is that back in 2007 i wrote an sms
gateway using a GPRS modem and it used to work with fgets. The same
script today, does not work.

exec('mode com9 baud=9600 data=8 stop=1 parity=n xon=on');
$fd = fopen('COM9', "r+");
if ($fd){
  stream_set_timeout($fd, 1);
  stream_set_blocking($fd, 0);
  fputs($fd, "AT\r");
  $response="";
  while(!feof($fd)){
    $response.=stream_get_contents($fd, 2); // This will not work as it
hangs the script here.
//  $response.=fread($fd, 2); // This will not work as it hangs the
script here.
//  $response.=fgets($fd, 2); // This will not work as it hangs the
script here.
//  $response.=fgets($fd); // This will not work as it hangs the script
here. It used to work back in 2007.
    $lines=ereg_replace("\r","",$response);
    $lines=explode("\n",$lines);
    if (in_array("OK",$lines)) break;
    if (in_array("ERROR",$lines)) break;
  }
  print_r($lines);
  fclose($fd);
}


I managed to make it work using the php_dio extension on windows php
5.2.9.

exec('mode com9 baud=9600 data=8 stop=1 parity=n xon=on');
$fd = dio_open('COM9', O_RDWR);
if ($fd){
  dio_write($fd, "AT\r");
  $response="";
  while(1){
    $response.=dio_read($fd, 2);
//  $response.=dio_read($fd, 5);  // This will not work as it hangs the
script here.
    $lines=ereg_replace("\r","",$response);
    $lines=explode("\n",$lines);
    if (in_array("OK",$lines)) break;
    if (in_array("ERROR",$lines)) break;
  }
  print_r($lines);
  dio_close($fd);
}

RESULT: 
Array ( [0] => AT [1] => OK )

I hope i helped a bit with the above script. But please, someone has to
resolve this bug. Those problems make people underestimate PHP...

--
Christos.


Previous Comments:
------------------------------------------------------------------------

[2009-10-26 11:12:12] rpiccini at software4u dot it

Thanks for reply, but binary mode doesn't help to make it works. On WIN
XP and Ubuntu too nothing's changed.
 
Anyway, I found a difference during fread instruction between WIN and
Ubuntu that I haven't seen before (doesn't matter if binary mode is
activated or not):
 
[CODE]
$buffer = fread($fp,128); 
//$buffer = fgets($fp);   // tried also with fgets
[/CODE]
 
On WIN XP "fread" (and fgets too) hangs (never ending loop), while on
UBUNTU $buffer is always empty (can't read reply from serial port) but
the script doesn't loop on fread and goes (for the rest of my code)
correctly to the end.
 
It seems like "stream_set_blocking($fp,0)" doesn't work at all on WIN.
 
By the way, I haven't yet solved my problem...

------------------------------------------------------------------------

[2009-10-25 20:23:06] j...@php.net

Oops, and this of course: 

$fp = fopen('COM1:','rb+');

------------------------------------------------------------------------

[2009-10-25 20:22:36] j...@php.net

How about you open it in binary mode? Like this:

 $fp = fopen('/dev/ttyS0','rb+');

Might work bit better on windows..?


------------------------------------------------------------------------

[2009-10-25 15:33:32] rpiccini at software4u dot it

First of all sorry for my bad english.

Anyway. Yes, I'm sure that with my code can't read anything back on the
serial port. Can write but can't read replies.
I've already tried with other applications and the serial port has
always worked good as I expected. 
As I've already wrote in my firs post I can correclty send the same
commands to the serial port using other programming languages (and also
with a specific built-up application under WIN XP) and I get back the
right reply from the port (ASCII chr(6) in this case) using always the
same hardwar during my tests.
Just for information. I've a dual-boot PC (WIN XP and Ubuntu linux
9.04) so the hardware (PC, serial port, fiscal printer) are exactly the
same for both operating system.

I'm developing a cross-platform application (WIN/Linux) so I MUST find
a way to make the serial port to be read correctly on both o.s.
I don't have much experience with dio/pecl functions...but I wouldn't
like to use them, I'd prefer to have the standard PHP functions
(fgets/fread) working "correctly" (Why can I write correctly with fputs
but can't read with fgets/fread ???).

I've also tried to insert a "sleep" between the fputs and fread
operations just to verify any eventually time-related issue...but it
still doesn't work:

<?php
  // on UBUNTU
  $fp = fopen('/dev/ttyS0','r+');
  // on WIN XP
  /*fp = fopen('COM1:','r+');*/
  stream_set_timeout($fp, 0, 100);
  stream_set_blocking($fp,0);

  $stx = chr(2);
  $etx = chr(3);
  $string = $stx."030301346".$etx;     // command to eject paper
  fputs($fp,$string);
  echo "SENT: ".$string."<br />\n";      // display string sent to
serial port
  usleep(200);                           // a delay before reading the
port
  //sleep(1);                            // more delay tried...
  $buffer = fread($fp,128);              // tested with several int
values
  echo "RECEIVED: ".$buffer."<br />\n";  // display NOTHING!
  fclose($fp);
?> 

Curiosity. I've found a PHP class on
www.phpclasses.org/browse/package/3679.html in which is developed a
function for serial port reading ONLY on Linux (but it seems doesn't
work!) and NOT for WINDOWS...why seems this thing so difficult to
manage?? 

I do think this is a bug...pleas help me!

------------------------------------------------------------------------

[2009-10-23 18:22:27] johan...@php.net

For using the serial port from linux I'd suggest to take a look at the
dio extension so you can set baud rate, parity, ... via 
dio_tcsetattr()

Are you sure your device really returns anything? did you try other
serial port applications?

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/49976

-- 
Edit this bug report at http://bugs.php.net/?id=49976&edit=1

Reply via email to