Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Python: Python

Perl conversion to python...

 

 

Python python RSS feed   Index | Next | Previous | View Threaded


bschollnick at gmail

Nov 23, 2009, 5:26 AM

Post #1 of 3 (155 views)
Permalink
Perl conversion to python...

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;
}

}
}

--
http://mail.python.org/mailman/listinfo/python-list


james at agentultra

Nov 23, 2009, 8:59 AM

Post #2 of 3 (143 views)
Permalink
Re: Perl conversion to python... [In reply to]

Benjamin Schollnick <bschollnick [at] gmail> 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


hansmu at xs4all

Nov 24, 2009, 2:38 PM

Post #3 of 3 (137 views)
Permalink
Re: Perl conversion to python... [In reply to]

J Kenneth King wrote:
> Benjamin Schollnick <bschollnick [at] gmail> 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

--
http://mail.python.org/mailman/listinfo/python-list

Python python RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.