B&R String über RS 232 an Drucker ausgeben

Heppo

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Grüßt Euch,

ich möchte mehrere Zeilen Text an einen Drucker über die serielle Schnittstelle ausgeben.

Zur Zeit habe ich eine PC mit Hyperterminal als Endteilnehmer. Die RS232 an der B&R funktioniert.
Es kommen einige Zeilen am PC an. Dann gibt es im Programm einen Fehler: Und zwar geht der DVWrite auf Störung mit der Fehlernummer 8078 ("Der Auftrag wird abgehlehnt, weil in der Sendewarteschlange bereits die maximal erlaubte Anzahl von Sendepuffern (siehe Funktion FRM_xopen) eingereiht ist").

Ich rufe nur einmal den FRMgbuf auf, dann werden die Zeilen eine nach der anderen (pro Zyklus eine) übergeben.

Hat da jemand Erfahrung?

Danke Euch für die Mühe
Heppo
 
Kenn mich mit B&R nicht aus, aber vielleicht hilft Dir das:

Ich denke eine Zeile pro Zyklus ist viel zu schnell.

Angenommen der serielle Zeichenrahmen ist 8N1,
ein Byte belegt 10 Bits. Bei 9600 Baud kommst Du
somit auf 960 Zeichen pro Sekunde.
Bei Zykluszeiten im Millisekundenbereich ist dann
ruckzuck der Puffer voll...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
re:

Hallo Heppo,

ein Tip meinerseits. Du musst den Buffer auf empty ueberwachen,
sprich status = 0. Die Meldung 8078
frmERR_TRANSMITOVERRUNSend buffer waiting queue full
sagt aus, das der Send-Buffer die Daten nicht los wird. Du kannst
dann mit FRM_robuf_01 den Inhalt des Buffers loeschen und den
zuletzt gesendeten String nochmal senden. Nachteil ist aber,
alles was im Buffer stand ist weg.

Ein andere Punkt ist, das Dein Drcker einfach zu langsam ist um
die Daten entgegen zu nehmen, weil der Sendbuffer wie wild
seine Daten los werden will. Frage ist jetzt in welcher Zykluszeit
du das ganze laufen laesst? Du bist doch wohl nicht dabei in TK#1
mit 10ms den Buffer zuzuschuetten?

Tip:
a. Baue einen wait-step ein = 100ms bis 5000ms (testen)
b. Benutze die Funktion FRM_ctrl(), damit kannst Du das
DSR/DTR Signal abfangen. Kommt das signal/event sendest
Du die naechsten Daten. Serial interface ABC....
c. Vergroessere Deinen send-buffer in FRM_xopen_01.
d. Passe Deine config_structure an. Wie sieht Deine config aus?
Kannst Du die mal hier her kopieren?

<schinpp vom init>
config_struct.idle := 4;
config_struct.delimc := 0;
strcpy(ADR(config_struct.delim), '00');
config_struct.tx_cnt := 8;
config_struct.rx_cnt := 8;
config_struct.tx_len := 512; (* bytes *)
config_struct.rx_len := 512; (* bytes *)
config_struct.argc := 0;
config_struct.argv := 0;
</schnipp vom init>

e. Sieh Dir nochmal die Hilfe zu DVframe an. Besonders die
open Funktion.

Hilft alles nichts dann mail nochmal mit Kopie Deine config-struct.

Gruss,

Mike
 
Zuletzt bearbeitet:
Du kannst auch mit dem Funktionsbloch _GLOBAL FRM_ctrl_typ frm_control;kontrollieren, ob die Zeile schon gesendet wurde und bei einem StatusOutarg von 0 die nächste Zeile senden. Wenn gerade gesendet wird dann ist der StatusOutarg = 1.
Eine andere (unschöne) Möglichkeit ist, die Zykluszeit zu vergrößern - dann gehts auch!!

lg
Hannes


frm_control.enable = 1;
frm_control.ident = frm_xopen.ident;
frm_control.ioctrl = 0x23;
FRM_ctrl(&frm_control); /* get handshake info */
StatusControl = frm_control.status; /* get status */
StatusOutarg = frm_control.outarg; /* get status */
 
re:

Hallo Hannes,

so gehts auch. Wie gesagt der FRM_ctrl schafft das
sehr gut. Habe das heute schnell mal nachgestellt.

War ein ruhiger Tag und ich konnte mal wieder etwas spielen.
Habe sogar meinen PacMan auf ein APC600 portiert.

Gruss,

Mike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, so gehts am besten, Kannst du mir nicht noch schreiben warum ich auf den Speicherbereich von den Tasten nicht schreiben kann bzw. was dahinter steht (was da das Betriebssystem VXWorks macht)
Ich wäre dir sehr dankbar für jede Information!!

Vielen Dank!

lg
Hannes
 
Hallo,
danke für die ganzen Tips, werde ich mir nach und nach anschauen. Bin auch mit der Länge des Strings schon weiter gekommen.

Noch eine Frage: Wenn ich in der ersten Zeile "-------------" drucke, dann einen CR LF ausführen möchte, wie bekomme ich das in den String?
Die Zeichen Kopiere ich ja mit strcpy, strcat.

Schöne Ostern, Bernd
 
Hallo,
danke für die ganzen Tips, werde ich mir nach und nach anschauen. Bin auch mit der Länge des Strings schon weiter gekommen.

Noch eine Frage: Wenn ich in der ersten Zeile "-------------" drucke, dann einen CR LF ausführen möchte, wie bekomme ich das in den String?
Die Zeichen Kopiere ich ja mit strcpy, strcat.

Schöne Ostern, Bernd

strcpy, strcat sind Funktionsaufrufe der Standard-C-Bibliothek.
Dann probier's mal mit diesem String:
"-------------\r\n"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
strcpy, strcat sind Funktionsaufrufe der Standard-C-Bibliothek.
Dann probier's mal mit diesem String:
"-------------\r\n"


Danke, das hatte ich total vergessen, so einfach kann die Welt funktionieren.

Noch eine Frage:
Den String den ich sende, hat 1024 Byte Gesamtlänge. Nun benötige ich nicht immer die gesamte Länge. Damit nicht bei einem kurzen Ausdruck anschließend noch die alten Zeichen gedruckt werden, lösche ich den Inhalt des Strings mit einer Schleife, in der immer 0 auf die einzeln Bytes geschrieben wird. Jetzt werden die Leerzeichen aber auch immer nicht ausgegeben. Das möchte ich nicht, es soll nach dem letzten "-----\L\N" Ende sein. Wie bringe ich das der Zeichenkette bei?

Frohe Ostern von Heppo
 
re

Hallo Heppo,

das haengt davon ab welche Sprache Du verwendest.
Bei ST z.B. ist das mit strcpy(adr(dein_string), adr(' '));
damit ist alles weg oder Du machst ein memset:
memset(adr(dein_string), 0, sizeof(dein_string));

Zum check der string laenge die Du drucken moechtest
gibt es in der standard library die Funktion LEN(adr(dein_string));
Das Ergebnis gibt Dir die Laenge aus. Die Info benutzt Du fuer
data_send_length. ganz einfach.

In allen anedern Sprachen (ansi-c......) funktioniert das aehnlich.

Gruss,

Mike
 
Zurück
Oben