Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

missing data reading port #2

Open
GoogleCodeExporter opened this issue Dec 1, 2015 · 4 comments
Open

missing data reading port #2

GoogleCodeExporter opened this issue Dec 1, 2015 · 4 comments

Comments

@GoogleCodeExporter
Copy link

What steps will reproduce the problem?
1. connect serial port to insteon PLM
2. send PLM data from another script
3. sometimes retrieve incomplete data when watching serial port with following 
code:
require('php_serial.class.php');
$serial = new phpSerial();
$serial->deviceSet("/dev/ttyS0");
$serial->confBaudRate(19200);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->deviceOpen();
do{
    $line = $serial->readPort();
    if($line){
        //unpack() gives me an array.  Then because it's hex, I need to typecast
        //it to string, otherwise I'll have a very big number!
        $hex = (string)join("", unpack("H*", $line));
        do{
            $match = 0;

            $pattern = '/^0262([0-9A-F]{6})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})06/i';
            if(preg_match($pattern, $hex, $matches)){
                $hex = preg_replace($pattern, "", $hex);
                print "PLM ACK'd SD command ${matches[3]} ${matches[4]} sent to ${matches[1]}\n";
                $match = 1;
            }

            $pattern = '/^0250([0-9A-F]{6})([0-9A-F]{6})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/i';
            if(preg_match($pattern, $hex, $matches)){
                $hex = preg_replace($pattern, "", $hex);
                print "PLM received SD sent from: ${matches[1]} -> ${matches[2]}; Flag: ${matches[3]} Commands: ${matches[4]} ${matches[5]}\n";
                $match = 1;
            }
        }while($match);
        if($hex){
            print "Line: $hex\n";
        }
    }
    sleep(1);
}while(1);

What is the expected output? What do you see instead?
Expect the following two lines repeated as often as I send data:
PLM ACK'd SD command 13 00 sent to 111111
PLM received SD sent from: 111111 -> aaaaaa; Flag: 21 Commands: 13 00

Get (randomly) missing data:
PLM ACK'd SD command 13 00 sent to 111111
PLM received SD sent from: 111111 -> aaaaaa; Flag: 21 Commands: 13 00
PLM ACK'd SD command 13 00 sent to 111111
PLM ACK'd SD command 13 00 sent to 111111
PLM ACK'd SD command 13 00 sent to 111111
PLM received SD sent from: 111111 -> aaaaaa; Flag: 21 Commands: 13 00


What version of the product are you using? On what operating system?
latest source from this repository.
ClearOS 5.1 - 2.6.18-164.11.1.v5PAE #1 SMP

Please provide any additional information below.
Reading the serial port has improved; I first found an earlier version of this 
class, which was even more sporadic.  This version is much better, but still 
missing data.  I am confident the data should be there, but this class isn't 
capturing it from the port.  Perhaps my logic above is bad; I'd love it to be 
that easy!

Original issue reported on code.google.com by [email protected] on 14 Jun 2010 at 5:38

@GoogleCodeExporter
Copy link
Author

# I reworked the code above as indicated by the changes below.  I did this
# after seeing an updated example in the change log.
# With the changes below (which only change the code above beginning with do{
# and ending with $hex = (string)...)
# -- I am still not capturing all the data from the serial port.
function microtime_float(){
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
do{
    $read = '';
    $theResult = '';
    $start = microtime_float();
    while ( ($read == '') && (microtime_float() <= $start + 0.5) ) {
        $read = $serial->readPort();
        if ($read != '') {
                $theResult .= $read;
                $read = '';
        }
    }
#    $line = $serial->readPort();
    $hex = (string)"";
    if($theResult){
        //unpack() gives me an array.  Then because it's hex, I need to typecast
        //it to string, otherwise I'll have a very big number!
        $hex .= (string)join("", unpack("H*", $theResult));
#Continue with no more changes.

Original comment by [email protected] on 14 Jun 2010 at 5:58

@GoogleCodeExporter
Copy link
Author

Have you had any luck with this? I am very interested because the plmtools that 
I used to use to connect with the PLM no longer seem to work since I upgraded 
to Fedora 13.



Original comment by [email protected] on 11 Oct 2010 at 5:18

@GoogleCodeExporter
Copy link
Author

I had issue with my serial port configuration, specifically that special 
characters were allowed and ending the communication.  Try "-isig -icanon" stty 
flags.

Original comment by [email protected] on 19 Apr 2011 at 9:53

@GoogleCodeExporter
Copy link
Author

With regard to my previous comment, this was only needed for linux, haven't 
checked OSX, and they werent required for windows.

Original comment by [email protected] on 20 Apr 2011 at 9:09

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant