soo hier mal mein kleines testscript in perl:
es kann prüfen ob HS485PCI vorhanden ist,
un man kann 2 Ausgänge schalten.
Leider habe ich die umsetzung der CRC-berechnung nicht hinbekommen…
in php funzt es aber in perl komme ich auf andere ergebnisse.
#!/bin/perl -w
#Testprogramm für HS485 PCI
#Schaltet Aktor 2+3 an Adresse 0x00000e30 Ein und Aus
#Switch Port 2+3 on adress 0x00000e30 on and off
# call with : perl test_hs485 /dev/ttyUSBx
use strict;
use Device::SerialPort;
use bigint;
#--------------------------------Variablendeklaration-------------------------------------------------
my $send_cmd;
my $strToSend;
my $strReceived;
my $CRC16;
my $CRCreg;
my $cp;
my $bp;
my @s;
my $s;
#---------------------------------Datenübergabe vom Programmaufruf
#----------------------------------Get parameter on program start
my ($port, $hex_cmd);
$port = shift;
$hex_cmd = shift;
#---------------------------------Erstellen der Seriellen Schnittstelle
#---------------------------------Open new serial port
my $device = Device::SerialPort->new ($port) or die " Konnte $port nicht öffnen!
";
$device->error_msg(1); # use built-in error messages
$device->user_msg(0);
$device->databits(8);
$device->baudrate(19200);
$device->parity("even");
$device->stopbits(1);
$device->dtr_active(0);
$device->handshake("rts");
$device->write_settings || die "Konnte Einstellungen für $port nicht setzen
";
$device->read_char_time(0); # don't wait for each character
$device->read_const_time(1000); # 1 second per unfulfilled "read" call
#---------------------------------Prüfen ob HS485 vorhanden
#---------------------------------Test if HS485PCI present
my @bytes = (0xFE, 0x04, 0x01, 0xBE, 0xD2); #command for get software version from HS485PCI
my $cmd = pack('C*',@bytes); #convert Databytes into datastream
$device->write($cmd); #send cmd
my ($cnt,$data)=$device->read(255); #read 255 Chars max.
if ($cnt > 0) { #process received data and check if interface is present
$data= unpack 'H*', $data;
if ($data eq 'fe00980005810115f6dc'){
print "HS485 vorhanden : $data
";
}
else{
die "Kein HS485 vorhanden
";
}
}
#----------------------------------Menüfunktionen------------------------
MENUE:
system 'clear';
print <<HERE_MENUE;
********************HS485PCI Testprogramm*************************
Port 2 ON [1]
Port 2 OFF [2]
Port 3 ON [3]
Port 3 OFF [4]
Read data from bus (10sek) [5]
Test CRC-calculation [6]
End [7]
HERE_MENUE
my $eingabe = 0;
chomp ($eingabe= <STDIN>);
SWITCH: {
$eingabe eq 1 && do {SwitchOnOff(1);
last SWITCH; };
$eingabe eq 2 && do {SwitchOnOff(2);
last SWITCH; };
$eingabe eq 3 && do {SwitchOnOff(3);
last SWITCH; };
$eingabe eq 4 && do {SwitchOnOff(4);
last SWITCH; };
$eingabe eq 5 && do {ReadBus();
last SWITCH; };
$eingabe eq 6 && do {testcrc();
last SWITCH; };
$eingabe eq 7 && do {print "Beendet
";
exit;};
}
sub SwitchOnOff {
my $parm = shift;
if ($parm eq 1){
@bytes = (0xFD, 0x00, 0x00, 0x0E, 0x30, 0x98, 0x00, 0x00, 0x00, 0x00, 0x06, 0x73, 0x00, 0x03, 0x01, 0x14, 0x86); #Sende Aktor 3 ON /send port3 ON
$cmd= pack('C*',@bytes);
$send_cmd = unpack ('H*',$cmd);
print"Sende: $send_cmd
";
$device->write($cmd);
}
if ($parm eq 2){
@bytes = (0xFD, 0x00, 0x00, 0x0E, 0x30, 0x98, 0x00, 0x00, 0x00, 0x00, 0x06, 0x73, 0x00, 0x03, 0x00, 0x04, 0x84); #Sende Aktor 3 OFF /send port3 OFF
$cmd= pack('C*',@bytes);
$send_cmd = unpack ('H*',$cmd);
print"Sende: $send_cmd
";
$device->write($cmd);
}
if ($parm eq 3){
@bytes = (0xFD, 0x00, 0x00, 0x0E, 0x30, 0x98, 0x00, 0x00, 0x00, 0x00, 0x06, 0x73, 0x00, 0x02, 0x01, 0x06, 0xA4); #Sende Aktor 2 ON /send port2 ON
$cmd= pack('C*',@bytes);
$send_cmd = unpack ('H*',$cmd);
print"Sende: $send_cmd
";
$device->write($cmd);
}
if ($parm eq 4){
@bytes = (0xFD, 0x00, 0x00, 0x0E, 0x30, 0x98, 0x00, 0x00, 0x00, 0x00, 0x06, 0x73, 0x00, 0x02, 0x00, 0x16, 0xA6); #Sende Aktor 2 OFF /send port2 OFF
$cmd= pack('C*',@bytes);
$send_cmd = unpack ('H*',$cmd);
print"Sende: $send_cmd
";
$device->write($cmd);
}
goto MENUE;
}
sub ReadBus {
print "warte auf Daten...";
my $STALL_DEFAULT=10; # how many seconds to wait for new input
my $timeout=$STALL_DEFAULT;
my $chars=0;
my $buffer="";
while ($timeout>0) {
my ($count,$saw)=$device->read(255); # will read _up to_ 255 chars
if ($count > 0) {
$chars+=$count;
$buffer.=$saw;
$buffer= unpack 'H*', $buffer;
print "Empfangene Daten: $buffer
";
# Check here to see if what we want is in the $buffer
# say "last" if we find it
}
else {
$timeout--;
}
}
if ($timeout==0) {
print "Seit $STALL_DEFAULT sekunden keine Daten Emfangen - gehe zurück
";
goto MENUE;
}
}
sub testcrc {
#Beim Senden ist zu beachten, dass für die Berechnung der Checksumme
#an den String noch zwei Null-Bytes ("\x00\x00") anzuhängen sind.
#Die berechnete Checksumme wird dann anstelle dieser beiden Null-Bytes gesendet.
#
#For calculating the checksum you have to add 2 null bytes ("\x00\x00")
$strToSend = "\0xfe\0x04\0x01";
$CRC16 = GetCRC16($strToSend. 0x0000); # ergibt / gives "BED2"
print "Checksum 1: ". sprintf("%X", $CRC16). "
";
$strReceived = "\0xfe\0x04\0x01\0xBE\0xD2";
$CRC16 = GetCRC16($strReceived); # ergibt / gives "0"
print "Checksum 2: ". sprintf("%X", $CRC16). "
";
goto MENUE;
}
sub GetCRC16{
$CRCreg = 0xffff00;
$s = $_[0];
@s=split(//,$s);
for ($cp=0; $cp<length($s); $cp++){
$CRCreg |= ord($s[$cp]);
for ($bp=0; $bp<8; $bp++){
$CRCreg <<= 1;
if ($CRCreg & 0x1000000){
$CRCreg ^= 0x100200; # hier ist das Polynom 0x1002 enthalten
$CRCreg &= 0xffffff;
}
}
}
return $CRCreg >> 8;
}