Guest_imported
New member
- Jan 1, 1970
- 0
hello all
I just installed the Win32::SerialPort perl module using ppm and it installed fine BUT when i run this script i get erorrs... and i don't know why I get eorrors in line 11 which is this line:
$card = Device::SerialPort->new ($port) || die "Can't open $port: $!";
please help here is the whole script code
thanks
#!/usr/bin/perl
require "SerialPort.pm";
my $port = "/dev/ttyS0";
my @line; # variable to hold our received line
my $line;
&CreateInvertArray; # initialize invert array
$card = Device::SerialPort->new ($port) || die "Can't open $port: $!";
$card->baudrate(9600);
$card->parity("odd"
|| die "fail setting parity";
$card->databits(8) || die "fail setting databits";
$card->stopbits(1) || die "fail setting stopbits";
#$card->handshake("rts"
|| die "fail setting handshake";
$card->handshake("none"
|| die "fail setting handshake";
@line=resetcard(); # resets and returns ATR
$line=invbytes2string(@line); # do invert/reverse to display format
print "ATR=$line\n" if $line; # display our received atr bytes
# change our baud rate to 38400 for normal CAM communications
$card->baudrate(38400) || die "fail setting baudrate";
$verbosity=4;
sub processcmd90 {
my ($header,$body)=@_;
my @ins=string2invbytes($header);
my @body=string2invbytes($body);
sendbytes($card,@ins); #send cmd90 header
@line=getbytes($card); # receive our CAM reply
sendbytes($card,@body); # send cmd90 body
@line=getbytes($card); # get decoded cmd90
$line=invbytes2string(@line); # convert for display/logging
$line=~s/ *90 .. *$//;
return $line;
}
# resets HU card and returns ATR
sub resetcard {
$card->pulse_rts_on(1); # reset card by pulsing atr 0.5 milliseconds
delay(100); # wait for setup
$r=1;
@line=getbytes($card); # receive ATR bytes from card
$r=0;
return @line;
}
# send bytes to serial port and add an interbyte delay of 40 milliseconds
sub sendbytes {
my ($ob,@bytes)=@_;
my @temp=@bytes;
my $in;
my $ret;
delay(5);
while (@bytes) {
$_=shift @bytes;
$ob->write($_);
# print invbytes2string(($_));
delay(0.005);
do {
($ret,$in)=$ob->read(1);
delay(0.005);
}
until ($in eq $_);
}
}
# receive serial bytes and convert to normal by inverting/reversing
sub getbytes {
my ($ob)=@_;
my @line;
my $ret;
my $in;
delay(15);
do {
($ret,$in)=$ob->read(1) ;
push @line,$in if $ret;
delay(0.005);
#print invbytes2string(($in));
} until (!$ret);
return @line;
}
# create our invert/reverse lookup array
sub CreateInvertArray {
my $x=0;
@invert_array=();
while ($x<256) {
$byte=$x;
$c=0;
$y=0;
while ($y<8) {
$c |= (($byte & (1 << $y)) != 0) << (7 - $y);
$y++;
}
push @invert_array,~$c & 255; # push reversed/inverted byte into @invert_array.
$x++;
}
}
# our delay routine
sub delay {
my ($msec)=@_;
$msec=$msec/1000;
select (undef,undef,undef,$msec);
}
# convert inverted/reversed char byte array to normal hex string for logging/display
sub invbytes2string {
my @line=@_;
my $string;
while (@line) {
$_=shift @line;
$_=sprintf "%.2X",$invert_array[ord($_)];
#$_=sprintf "%.2X",ord($_);
$string.=$_ . " ";
}
return $string;
}
# convert a hex text string to an inverted/reversed byte char array
sub string2invbytes {
my ($string)=@_;
my @temp;
$string=~s/^ +//;
$string=~s/ +$//;
$string=~s/\n/ /gs;
my @temp2=split / +/,$string;
while (@temp2) {
$_=shift @temp2;
push @temp,chr($invert_array[hex($_)]);
#push @temp,chr(hex($_));
}
return @temp;
}
1;
I just installed the Win32::SerialPort perl module using ppm and it installed fine BUT when i run this script i get erorrs... and i don't know why I get eorrors in line 11 which is this line:
$card = Device::SerialPort->new ($port) || die "Can't open $port: $!";
please help here is the whole script code
thanks
#!/usr/bin/perl
require "SerialPort.pm";
my $port = "/dev/ttyS0";
my @line; # variable to hold our received line
my $line;
&CreateInvertArray; # initialize invert array
$card = Device::SerialPort->new ($port) || die "Can't open $port: $!";
$card->baudrate(9600);
$card->parity("odd"

$card->databits(8) || die "fail setting databits";
$card->stopbits(1) || die "fail setting stopbits";
#$card->handshake("rts"

$card->handshake("none"

@line=resetcard(); # resets and returns ATR
$line=invbytes2string(@line); # do invert/reverse to display format
print "ATR=$line\n" if $line; # display our received atr bytes
# change our baud rate to 38400 for normal CAM communications
$card->baudrate(38400) || die "fail setting baudrate";
$verbosity=4;
sub processcmd90 {
my ($header,$body)=@_;
my @ins=string2invbytes($header);
my @body=string2invbytes($body);
sendbytes($card,@ins); #send cmd90 header
@line=getbytes($card); # receive our CAM reply
sendbytes($card,@body); # send cmd90 body
@line=getbytes($card); # get decoded cmd90
$line=invbytes2string(@line); # convert for display/logging
$line=~s/ *90 .. *$//;
return $line;
}
# resets HU card and returns ATR
sub resetcard {
$card->pulse_rts_on(1); # reset card by pulsing atr 0.5 milliseconds
delay(100); # wait for setup
$r=1;
@line=getbytes($card); # receive ATR bytes from card
$r=0;
return @line;
}
# send bytes to serial port and add an interbyte delay of 40 milliseconds
sub sendbytes {
my ($ob,@bytes)=@_;
my @temp=@bytes;
my $in;
my $ret;
delay(5);
while (@bytes) {
$_=shift @bytes;
$ob->write($_);
# print invbytes2string(($_));
delay(0.005);
do {
($ret,$in)=$ob->read(1);
delay(0.005);
}
until ($in eq $_);
}
}
# receive serial bytes and convert to normal by inverting/reversing
sub getbytes {
my ($ob)=@_;
my @line;
my $ret;
my $in;
delay(15);
do {
($ret,$in)=$ob->read(1) ;
push @line,$in if $ret;
delay(0.005);
#print invbytes2string(($in));
} until (!$ret);
return @line;
}
# create our invert/reverse lookup array
sub CreateInvertArray {
my $x=0;
@invert_array=();
while ($x<256) {
$byte=$x;
$c=0;
$y=0;
while ($y<8) {
$c |= (($byte & (1 << $y)) != 0) << (7 - $y);
$y++;
}
push @invert_array,~$c & 255; # push reversed/inverted byte into @invert_array.
$x++;
}
}
# our delay routine
sub delay {
my ($msec)=@_;
$msec=$msec/1000;
select (undef,undef,undef,$msec);
}
# convert inverted/reversed char byte array to normal hex string for logging/display
sub invbytes2string {
my @line=@_;
my $string;
while (@line) {
$_=shift @line;
$_=sprintf "%.2X",$invert_array[ord($_)];
#$_=sprintf "%.2X",ord($_);
$string.=$_ . " ";
}
return $string;
}
# convert a hex text string to an inverted/reversed byte char array
sub string2invbytes {
my ($string)=@_;
my @temp;
$string=~s/^ +//;
$string=~s/ +$//;
$string=~s/\n/ /gs;
my @temp2=split / +/,$string;
while (@temp2) {
$_=shift @temp2;
push @temp,chr($invert_array[hex($_)]);
#push @temp,chr(hex($_));
}
return @temp;
}
1;