Perl conversion to python...

  • Thread starter Benjamin Schollnick
  • Start date
B

Benjamin Schollnick

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

}
}
 
J

J Kenneth King

Benjamin Schollnick said:
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.
 
H

Hans Mulder

# 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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top