Perl conversion to python...

Discussion in 'Python' started by Benjamin Schollnick, Nov 23, 2009.

  1. Folks,

    I'm having some issues here with pyserial & trying to translate a perl
    script to python... It's probably my inexperience with PySerial &
    perl that is troubling me...

    Can anyone assist?

    I'm concerned, since I can't seem to receive the data in any reliable
    manner.. I've tested multiple times, and only once received data...
    So I suspect that my Transmit & receive code is faulty...

    def xmit ( data, serialport ):
    for x in data:
    xmit_byte (x, serialport)
    # serialport.write ( binascii.unhexlify ( data ) )
    # for x in data:
    # print str(x).encode ('hex')
    # serialport.write ( x.encode('hex'))

    def receive ( serialport ):
    received = serialport.read (20)
    print received, "!"

    ----- Perl Code ----
    sub tx_command {
    my $port = shift;
    my $cmd = shift;

    # warn "tx_command($cmd)\n";

    my @cmd_bytes = split(/\s/, $cmd);

    foreach my $byte (@cmd_bytes) {
    $byte = pack('C', hex($byte));

    $port -> write($byte);
    select(undef, undef, undef, 0.01);
    }
    }

    # returns the rtt, or 0 if no response
    sub rx_response {
    my ($port, $address) = @_;

    $port->read_char_time(0); # don't wait for each character
    $port->read_const_time(5000); # timeout if we don't get what we're
    looking for

    my $buf = '';

    my $t_start = time;

    ### accumulate one byte at a time until we see the substring we're
    looking for

    while (1) {
    my ($count_in, $string_in) = $port->read(1);

    if ($count_in == 0) {
    # warn "TIMEOUT\n";
    return 0;
    }

    $buf .= $string_in;

    my $bufstring = packed_to_text($buf);

    #warn "bufstring: ".$bufstring;

    if ($bufstring =~/02 50 $address (.. .. ..) (..) (.. ..)/) {

    my $powerlinc_addr = $1;
    my $flags = $2;
    my $command = $3;

    # warn "got response!\n";

    my $rtt = time() - $t_start;

    return $rtt;
    }

    }
    }
    Benjamin Schollnick, Nov 23, 2009
    #1
    1. Advertising

  2. Benjamin Schollnick <> writes:

    > Folks,
    >
    > I'm having some issues here with pyserial & trying to translate a perl
    > script to python... It's probably my inexperience with PySerial &
    > perl that is troubling me...
    >
    > Can anyone assist?
    >
    > I'm concerned, since I can't seem to receive the data in any reliable
    > manner.. I've tested multiple times, and only once received data...
    > So I suspect that my Transmit & receive code is faulty...
    >
    > def xmit ( data, serialport ):
    > for x in data:
    > xmit_byte (x, serialport)
    > # serialport.write ( binascii.unhexlify ( data ) )
    > # for x in data:
    > # print str(x).encode ('hex')
    > # serialport.write ( x.encode('hex'))
    >
    > def receive ( serialport ):
    > received = serialport.read (20)
    > print received, "!"


    Gah.. indentation is broken in your post... :S

    >
    > ----- Perl Code ----
    > sub tx_command {
    > my $port = shift;
    > my $cmd = shift;
    >
    > # warn "tx_command($cmd)\n";
    >
    > my @cmd_bytes = split(/\s/, $cmd);
    >
    > foreach my $byte (@cmd_bytes) {
    > $byte = pack('C', hex($byte));
    >
    > $port -> write($byte);
    > select(undef, undef, undef, 0.01);
    > }
    > }


    import struct

    def tx_command(port, cmd):
    cmd_bytes = cmd.split(' ')

    for byte in cmd_bytes:
    byte = struct.pack('C', hex(int(byte)))
    port.write(byte)
    # select() is a system call in Perl..
    # insert Python equivalent here

    >
    > # returns the rtt, or 0 if no response
    > sub rx_response {
    > my ($port, $address) = @_;
    >
    > $port->read_char_time(0); # don't wait for each character
    > $port->read_const_time(5000); # timeout if we don't get what we're
    > looking for
    >
    > my $buf = '';
    >
    > my $t_start = time;
    >
    > ### accumulate one byte at a time until we see the substring we're
    > looking for
    >
    > while (1) {
    > my ($count_in, $string_in) = $port->read(1);
    >
    > if ($count_in == 0) {
    > # warn "TIMEOUT\n";
    > return 0;
    > }
    >
    > $buf .= $string_in;
    >
    > my $bufstring = packed_to_text($buf);
    >
    > #warn "bufstring: ".$bufstring;
    >
    > if ($bufstring =~/02 50 $address (.. .. ..) (..) (.. ..)/) {
    >
    > my $powerlinc_addr = $1;
    > my $flags = $2;
    > my $command = $3;
    >
    > # warn "got response!\n";
    >
    > my $rtt = time() - $t_start;
    >
    > return $rtt;
    > }
    >
    > }
    > }


    This isn't all that more complicated. I dunno, maybe it's just me but
    I find most Perl pretty easy to read (barring obfuscation which just
    takes longer to read but is no more difficult). For the most part you
    can generally substitute the Python equivalent statements for each
    line of Perl and get good results. Optimize for better Pythonicity
    afterwards.
    J Kenneth King, Nov 23, 2009
    #2
    1. Advertising

  3. Benjamin Schollnick

    Hans Mulder Guest

    J Kenneth King wrote:
    > Benjamin Schollnick <> writes:


    >> select(undef, undef, undef, 0.01);


    > # select() is a system call in Perl..
    > # insert Python equivalent here


    That would be:

    time.sleep(0.01)

    Perl has a sleep() built-in, but it truncates its argument to an int.
    If you want to sleep less than a second in Perl, you have to use select
    as shown.

    Not so in Python. Python's time.sleep() takes a float argument and
    calls some platform-dependent function that provides sleeping with
    sub-second accuracy. On some platforms, it ends up calling the
    C level select() function.

    Keep in mind that in both languages, your program may end up sleeping
    longer than it should due to scheduling or other activity on the system.


    Hope this helps,

    -- HansM
    Hans Mulder, Nov 24, 2009
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Koncept
    Replies:
    5
    Views:
    816
    Koncept
    Jun 3, 2005
  2. Andrew Robert
    Replies:
    3
    Views:
    790
    Andrew Robert
    May 18, 2006
  3. Andrew Robert
    Replies:
    2
    Views:
    451
    Peter Otten
    May 25, 2006
  4. srinivasan srinivas

    conversion of Python object to perl object

    srinivasan srinivas, Aug 17, 2009, in forum: Python
    Replies:
    0
    Views:
    359
    srinivasan srinivas
    Aug 17, 2009
  5. , India
    Replies:
    2
    Views:
    443
    Fraser Ross
    Sep 15, 2009
Loading...

Share This Page