Perl conversion to python...

J Kenneth King james at agentultra.com
Mon Nov 23 11:59:38 EST 2009


Benjamin Schollnick <bschollnick at 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.



More information about the Python-list mailing list