ID:               49976
 Updated by:       j...@php.net
 Reported By:      rpiccini at software4u dot it
-Status:           Open
+Status:           Feedback
 Bug Type:         Filesystem function related
 Operating System: WIN XP / UBUNTU 9.04
 PHP Version:      5.2.11
 New Comment:

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

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

Might work bit better on windows..?



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

[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?

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

[2009-10-23 17:43:08] rpiccini at software4u dot it

Description:
------------
Either on WIN XP or UBUNTU 9.0 can't read back any data from serial
port after correctly written to.

I'm trying to talk to a fiscal printer trough a custom protocol based
on ACK/NACK technique (send data -> receive answer -> respond to answer
-> ...)

With a serial port scanner (and from the ticket that are correctly
printed) I can see that the sent data are well received from fiscal
printer.

But any "replay" to sent data (which are present if data are sent to
serial port from other kind of software/programming languages) are
present.

The PHP Version is 5.2.11.
There were a similar bug report on 
http://bugs.php.net/bug.php?id=35531
but its state is "closed" (even if the case history is very similar and
the problem persists).

Reproduce code:
---------------
<?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
  $buffer = fread($fp,128);              // tested with several int
values
  echo "RECEIVED: ".$buffer."<br />\n";  // display NOTHING!
  fclose($fp);
?> 


Expected result:
----------------
a correct ACK (chr(6)) or an incorrect NACK (chr(15)) from serial port
(sent by the fiscal printer)

Actual result:
--------------
NOTHING (no a single char)


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


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

Reply via email to