Benjamin Schollnick <bscholln...@gmail.com> 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.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to