RS232 Schnittstelle


MedRamBO

Mitglied
Hallo,

ich versuche seit einigen Tage einen Drehteller der mittels eines Schrittmotors angetrieben wird über eine Serielle ( RS232 ) Schnittstelle an zu steuern. Das Projekt soll so enden, dass innerhalb von 40 Schritten eine 360° Drehung erfolgt und in den Pausen ein Foto geschossen wird. Das kann man dann mittels spezieller Software in eine 3D Flash animation erstellt werden.

Im Datenblatt des Herstellers sind folgende Angaben gemacht worden:
Im Drehtisch ist ein USB - R232 Konverter eingebaut von FTDI. Die neusten Treiber können von http://www.ftdichip.com heruntergeladen werden.

Die Schnittstelle ist wie folgt parametrisiert.
Baudrate 38400
Parität N
Datenbits 8
Stoppbit 1
Flusssteuerung keine

Alle Kommandos müssen mit CR ( Carry Return ) abgeschlossen werdenw.

N0000 - Stopp
P0000 - Stopp
P9999 - Drehe positiv
N9999 - Drehe negativ
NXXXX - Drehe um XXXX Schritte. ( Achtung es müssen immer 5 Zeichen gesendet werden )
PXXXX - Drehe um XXXX Schritte. ( Achtung es müssen immer 5 Zeichen gesendet werden )
W1X - Geschwindigkeit (X = 1-9)
Z0 - Nulle Position
S - Gerätestatus

Gerätestatus beinhaltet übrigens folgenden String:
ERR:00h ERRX:02h State:21h Position:0000 EndPosN:-010 EndPosP:0038 P0:30h P1:CCh
Was bereits wunderbar funktioniert:
Ich habe mich mit einem Hyperterminal auf den Port "angemeldet". Da habe ich dann einfach nur "S" getippt und alles klappt. "P0100" alles wunderbar. Es läuft und das ohne Ausfälle.
Es musste nicht erst eine Geschwindigkeit eingestellt werden, oder irgentwas anderes. Es ging einfach direkt nach absetzen des Kommandos.

Nun zum Problem. Ich habe mit Perl das ganze ebenfalls probiert ( siehe code unten ). Da kommt auch gleich der Haken. Die Schnittstelle scheint nur manchmal auf den "WRITE" command zu reagieren. Ca. 1 von 20 mal. Ich finde den wurm nicht. Muss ich irgentwas noch initialisieren was die Terminalverbindung macht? Da klappt es 100%. Ich komme nicht weiter. Selbiges Programm habe ich auch schon mit Java und Events gelöst, es bleibt aber bei der Fehlererscheinung wie im Perl Programm nur das es dort alle 1 von 5 mal funktioniert.

Ich hoffe ihr könnt mir helfen!

PHP:
#!/usr/bin/perl -w
use strict;
use Device::SerialPort;

# Create Instance
my $ob = Device::SerialPort->new("/dev/tty.usbserial-FTAJM0F6");
 
# Initialise Instance
$ob->baudrate(38400);
$ob->parity('none');
$ob->databits(8);
$ob->stopbits(1);
$ob->handshake('none');
$ob->write_settings;

# Open Stream
open FILE, ">>test.txt";

# Parameter
my $drehung = "P0046\r";
my $geschwindigkeit = "W19\r";

sleep 1;

for( my $y = 0; $y < 40; $y++ )
{
	$ob->write( $drehung );
	
	#bild machen, folgt später über spezielle API
	sleep 8;
}

# Close Stream & Instance
close FILE;
$ob->close;
Mit freundlichem Gruß,
Frank
 

MedRamBO

Mitglied
Problem gelöst.. Hab mit nem COM Port monitor die daten geloggt die vom Terminal geschickt werden.. Die werden nacheinander gesendet und nich in einem ->write verarbeitet..

Sprich:
$ob->write( "P" );
$ob->write( "0" );
$ob->write( "0" );
$ob->write( "4" );
$ob->write( "6" );
$ob->write( 0x0D ); #entspricht carry return
 

Neue Beiträge