Req #49976 [Com]: Can't read anything from serial port

From: Date: Sun, 13 Jun 2021 16:02:13 +0000
Subject: Req #49976 [Com]: Can't read anything from serial port
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-234395@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=49976&edit=1

 ID:                 49976
 Comment by:         jeffery dot ollsan at gmail dot com
 Reported by:        rpiccini at software4u dot it
 Summary:            Can't read anything from serial port
 Status:             Open
 Type:               Feature/Change Request
 Package:            *General Issues
 Operating System:   *
 PHP Version:        *
 Block user comment: N
 Private report:     N

 New Comment:

I'm not sure how well your printers operate, but the ones in my office and home do. With a few
readily replaced rollers and drums, I've seen 20-year-old laserjet monstrosities print like
new.

Network printing in Windows works almost right out of the box.

All of the other stuff we want our printers to do, on the other hand, is usually not very good
because it's tacked on as an afterthought to the core function and suffers from a lot of
proprietary software and IP.

However, getting an 8.5" x 11" printer to print from anyplace in the facility seems to be
a challenge these days. You can check details at https://topvinylcutters.com/best-3d-printer-under-1000/

However, toss that cheap HP inkjet in the trash and invest in a good laser printer.


Previous Comments:
------------------------------------------------------------------------
[2011-04-22 21:59:22] beekerstudios at gmail dot com

I struggled to find solutions to doing serial with php. I went so far as to do it in python, 
which I'm a novice at, but it brought to light why it wasn't working for me in php, my
commands 
were just wrong. It's amazing how little documentation on it there is. Someone needs to do a
good 
blog post about it. (looks at self)

On to why my actually useful comment...
Sleeping the script between fputs and fgets seems to do the job of resolving this. Yah it stalls 
the script a bit, but for the most part it's workable. It just means you can't constantly
send 
messages to a device with serial commands.

function sendSerialCommand($port,$command){
    mode $port: BAUD=9600 PARITY=N data=8 stop=1 xon=off;
    $fp = fopen ($port.":", "r+");
    if (!$fp) {
        echo "Uh-oh. Port not opened.";
    } else {
	if($command == "on"){
	    echo "Turning on.<br />";
	    $string = "\x2a\x70\x6f\x77\x3d\x6f\x6e\x23";
        } else if($command == "off"){
	    echo "Turning off.<br />";
	    $string = "\x2a\x70\x6f\x77\x3d\x6f\x66\x66\x23";
        } else if($command == "status"){
	    echo "Checking status.<br />";
	    $string = "\x2a\x70\x6f\x77\x3d\x3f\x23";
	}
	fputs ($fp, $string);
	sleep(1);
	$response="";
  	while(!feof($fp)){
    	    $response.=stream_get_contents($fp, 2);
    	    $lines=explode("\n",$response);
  	}
  	print_r($lines);
        fclose ($fp);
    }
}
sendSerialCommand("COM3","on")

------------------------------------------------------------------------
[2010-01-15 20:19:37] stash_85 at hotmail dot com

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.

------------------------------------------------------------------------
[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] jani@php.net

Oops, and this of course: 

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

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

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

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

Might work bit better on windows..?


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


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

    https://bugs.php.net/bug.php?id=49976


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


Thread (14 messages)

« previous php.bugs (#234395) next »