Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

V24 Schnittstelle

Danni_KA / 9 Antworten / Baumansicht Nickles

Hallo,


ich bin newby und habe ein ziemlich grosses Problem mit dem Übersetzten eines alten Turbo C++ Codes!


In diesem älternen Programm werden Daten mit einer DOS-Applikation über die serielle Schnittstelle an ein externes Gerät geschickt, welches als Antwort ebenfalls Daten zurückgibt.


z.B. Senden:


unsigned send ( char ch )


byte buf[2];


int int_ch;


int_ch = ch;


send14_std ( &int_ch, ss );


void send14_std (int *value, int channel)


{


union REGS r;


r.x.ax = *value;


r.h.ah = 1;


r.x.dx = channel;


int86 (0x14, &r, &r);


*value = r.x.ax;


daneben wird dann noch syncronisiertund aufs Echo gewartet!


Mein Problem ist, das ich nicht verstehe, was, wann und welche Zeichen bzw. Zahlen über die Schnittstelle geschickt werden! Mein Hyperterminal zeigt irgendwie nichts gescheites an!


Kann mir jemand weiterhelfen oder ein Tipp geben um das ganze zu verstehen?


Hab leider keine Beschreibung für den Controller im externen Gerät; außer die Anforderungen an Baud, Stopbits usw.


Bin über jeden Hinweis dankbar.


Liebe Grüsse


Danni

bei Antwort benachrichtigen
Andreas42 Danni_KA „V24 Schnittstelle“
Optionen

Hi!

Ich weiss nicht, ob ich dir wirklich helfen kann, da du nicht genau beschreibst, wo das Problem beim Verstehen des Codes liegt. Da du die Routine zum Senden angegeben hast, denke ich du willst wissen, was da passiert.

Hier wird für jedes Zeichen die Interupt $14 im BIOS eines PCs aufgerufen. Das ist der Interupt, der zur Ansteuerung der seriellen Schnittstelle dient.

Der Inreupt $14 wird hier mit die Funktionsnummer im Register AH übergeben und in DX die Nummer der seriellen Schnittstelle. Das zu sendene Zeichen steht im Register AL.

Im Prinzip sollte das Programm so arbeiten:

Die serielle Schnittstelle wird über einen Aufruf von Int$14 mit Funktion 00 initialisiert. dann werden die Zeichen einzelnd über die Funktion 01 übertragen. Über Funktion 02 werden zeichen eingelesen und Funktion 03 dient zum Abfragen des Status der Schnittstelle.

Dokumentationen darüber hab' ich aus meinem alten Buch "PC Intern 4" von Michael Tischer. Ich denke, dass man alle nötigen Details zu den Interupts und den Funktionen auch in Ralf Browns Interuptliste finden wird (jupp, ist so: http://www.ctyme.com/rbrown.htm).

Wenn du die serielle Schnittstelle unter Windows nutzen willst, dann hilft dir evtl. dieser Link weiter, der ein Beispiel für Delphi 2.0 enthält. Die Sprache ist allerdings hier nicht wirklich wichtig, da es um die verwendeten WinAPI-Funktionen geht, die man verwenden muss:

http://www.developers.demon.co.uk/serial.html

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Danni_KA Andreas42 „Hi! Ich weiss nicht, ob ich dir wirklich helfen kann, da du nicht genau...“
Optionen

Danke Andreas für deine schnelle Hilfe!
Wie die Programmierung der seriellen Schnittstelle mit Win-Api funktioniert, hab ich schon erfolgreich unter Visual C++ Studio getestet. Kann Zeichen bzw. Zahlen senden und empfangen.
Hab mich jetzt zwar noch nicht in die Interrupt-Geschichte eingearbeitet, würde aber vorher gerne wissen, ob sich auf mein externes Gerät überhaupt mit Win-Api Funktionen zugreifen lässt. Ich müsste ja eigentlich die einzelnen Register einzeln schreiben bzw. lesen, was mit einfachen Sendebefehlen oder Empfangsbefehlen in Visual ja nicht explizit möglich ist.
Bitte um eure Meinung -Danke ;)

bei Antwort benachrichtigen
vergisses Danni_KA „Danke Andreas für deine schnelle Hilfe! Wie die Programmierung der seriellen...“
Optionen

Hallo Danni_KA,

da das externe Gerät über die serielle Schnittstelle
angeschlossen ist, mußt Du eigentlich nur das
gleiche tun, was die DOS Anwendung macht und
solltest dann auch zu den gleichen Ergebnissen kommen ;-)

Mit der WinAPI geht das sogar leichter von der Hand,
da Du nicht jedes Zeichen einzeln, sondern komplette
Sequenzen mit einem Befehl übertragen kannst.

Ich habe mal vor ein paar Jahren eine kleine DLL mit
den benötigten Funktionen geschrieben.
Du brauchst eigentlich nur folgende Operationen
zu implementieren:
ser_open() // Oeffnet die Serielle Schnittstelle
ser_close() // Das Gegenstueck
ser_para() // Einstellen der Kommunikationsparameter
ser_read() // Lesen
ser_write() // Schreiben

mit
hComm=CreateFile(devnam,GENERIC_READ|GENERIC_WRITE,NULL, NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Holst Du ein Handle auf das Device.

mit
CloseHandle(hComm);
Kannst Du es wieder schliessen

Über die Struktur COMMCONFIG und
GetCommConfig(hComm,lpCC,lpdwSize);
BuildCommDCB(lpDef,&CC.dcb);
SetCommConfig(hComm,lpCC,wSize);
GetCommTimeouts(hComm,lpCommTimeouts);
SetCommTimeouts(hComm,lpCommTimeouts);
kannst Du die Kommunikationsparameter lesen und setzen.

Mit
ReadFile(hComm,retwert,cnt, (LPDWORD)&readBytes, NULL);
WriteFile(hComm,retwert,strlen(retwert), (LPDWORD)&readBytes, NULL);
kannst Du lesen und schreiben.

Den Rest kannst Du ausführlich in der MSVC Hilfe nachlesen.

Gruss, vergisses

bei Antwort benachrichtigen
Danni_KA vergisses „Hallo Danni_KA, da das externe Gerät über die serielle Schnittstelle...“
Optionen

Danke vergisses!
Ich kann also mit den einfachen Funktionen volle Sepuenzen schicken und empfangen! Das Problem ist aber, das das externe Gerät nicht darauf reagiert bzw. ich nicht genau weiß was für Zeichen erwartet werden. Deshalb hab ich schon sämtlich Dinge wie Hyperterminal oder Serial Monitor ausprobiert -ohne Erfolg.

bei Antwort benachrichtigen
Andreas42 Danni_KA „Danke vergisses! Ich kann also mit den einfachen Funktionen volle Sepuenzen...“
Optionen

Hi!

Die nötigen Hinweise zur Brogrammierung der Schnittstelle hast du ja schon.

Mir fällt noch ein, dass die serielle Schnittstelle ja konfiguriert werden muss. Hast du die Daten für dein externes Gerät? (Sie müssten im vorliegenden Programm über einen Int14 Aufruf mit Funktion 0 (Null) gesetzt werden.

Ich muss aber gestehen, dass ich bisher serielle Geräte nur unter DOS angesteuert habe und meine Experimente unter Windows sich auf ein Programm beschränkt, dass ich nicht selbst testen kann, weil ich das angesteuerte Gerät nicht hier habe (ich warte noch auf die Rückmeldung...).

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
vergisses Andreas42 „Hi! Die nötigen Hinweise zur Brogrammierung der Schnittstelle hast du ja schon....“
Optionen

Der Danni_KA möchte ja die vermutlich die alte DOS Anwendung
nach WIN portieren.
Falls er Zugriff auf eine funktionsfähige Umgebung mit
dieser alten Anwendung hat, sollte er mit "mode com(x)"
die Kommunikationsparameter auslesen und im WIN Programm
mit
SetCommConfig(hComm,lpCC,wSize);
SetCommTimeouts(hComm,lpCommTimeouts);
setzen können.

Gruss, vergisses

bei Antwort benachrichtigen
vergisses Danni_KA „V24 Schnittstelle“
Optionen

Hallo Danni_KA,

die benötigten Sequenzen und die
Reaktionen des Geräts solltest Du
entweder der Gerätedokumentation
oder dem Quelltext des DOS Programms
entnehmen können.

Alternativ kannst Du einen Sniffer in die
Übertragungsleitung einschleifen.
Die dazu nötige Hard- und Software
ist allerdings nicht billig.

Es gibt unter
http://garbo.uwasa.fi/pc/comm.html
ein DOS Tool "Commhex" zum Mitlesen der über den
seriellen Port reinkommenden Daten.
Evtl. hilft das ja weiter...

Gruss, vergisses

bei Antwort benachrichtigen
Danni_KA Nachtrag zu: „V24 Schnittstelle“
Optionen

Hallo,

möchte die Anwendung nicht portieren, vielmehr eine neue Anwendung unter Visual schreiben, die das selbe kann wie die Dos-Applikation -nur eben unter Windows läuft. Also alles was ich habe ist der Quelltext und die Technischen Daten:
Baudrate=2400; Zeichenformat auf den DAtenleitungen TXD und RXD: 8-Bit-ASVII-Code, 1 Startbit, 2 Stopbit, no parity, asynchron; Steuerleitung DTR und DSR: Eine Ein- und Ausgangssteuerleitung für Hardware-Handshake; Pegel: Alle Leitungen V.28 DIN 66259
Komm leider am Wochenende nicht dazu, werd aber am Montag zunächst mal commhex aufprobier -vielleicht hilft es mir ja weiter.
Vielen Dank und schönes Wochenende euch
Daniel

bei Antwort benachrichtigen
vergisses Danni_KA „Hallo, möchte die Anwendung nicht portieren, vielmehr eine neue Anwendung unter...“
Optionen

Hallo Danni_KA,

wie soll man es denn sonst nennen, wenn die neue WIN Anwendung
dasselbe wie die alte DOS Anwendung können soll ?
Natürlich wird das Look & Feel unter einer GUI anders aussehen,
der Quelltext in weiten Teilen neu geschrieben werden
und evtl. neue Funktionen dazu kommen.

Was mich aber am Meisten wundert ist, daß Du die
Befehle an die Box und die Reaktionen der Box
nicht in den alten Quelltexten finden kannst.
Ich hätte eigentlich erwartet, dass man da
fündig wird.

Gruss, vergisses

bei Antwort benachrichtigen