9bit Daten mit FT232/FT245 übertragen

Gast #249820
Lesenswert?

Der Betreff sagt schon alles:
Ich benötige eine Unterscheidung bei den übertragenen Daten zwischen
Befehle und Daten, daher brauche ich irgendwie ein 9. bit.
Kann man sowas mit einem FT... machen, und wenn ja wie ?

Am normalen PC UART gehts mit ein paar Tricks, aber beim FT232 ist das
warscheinlich sehr viel schwerer.
Gast #249821
Lesenswert?

Bei seriellen Protokollen macht man das normalerweise mit sog.
Escapezeichen.

Beispiel: Du hast drei Kommandobytes mit den Werten 0,1,2.

Die schickst Du auch genau so. Wenn Du jetzt Datenbytes mit denselben
Werten senden willst, stellst Du diesen ein Escapezeichen voran (dessen
Bytewert Du halt vorher festlegen musst. Im ASCII-Zeichensatz ist das
z.B. Wert 27).

Anstatt 1 schickst Du jetzt also 27, und dann 1.
Wenn Du den Datenwert 27 senden willst, schickst Du 27 zweimal.

Empfängerseitig: Immer wenn der Empfänger ein Escapezeichen bekommt
(hier Wert 27), dann interpretiert er das nächste Byte als Datenbyte.

Theoretisch könntest Du jedem Datenbyte immer eine 27 voranstellen, was
natürlich Blödsinn ist. Immer nur Datenbytes, deren Wert einem
Kommandowert entsprechen, und dem Escapezeichen selber.

Wenn in Deinem Datenstrom viele Datenwerte mit Kommandowerten
vorkommen, sinkt natürlich Deine Datenrate entsprechend.
Gast #249822
Lesenswert?

Die Escapezeichen sind echt eine Alternative. Wiso komme ich selber nie
auf sowas einfaches ?
Ich denke ich werde es so machen.

Damit ich nicht noch einen zweiten Thread aufmachen muss, hier noch
eine andere Frage:
Kann ich den FT232 als virtuellen COM Port so initialisieren, dass er
CTS verwendet ?
Ich möchte, dass der FT232 nur Daten sendet wenn CTS auf Low liegt.

    dcb.BaudRate = baud_rate;
  dcb.ByteSize = 8;
  dcb.Parity = NOPARITY;
  dcb.StopBits = ONESTOPBIT;

  dcb.fOutxCtsFlow = TRUE;
  dcb.fAbortOnError = FALSE;
  fSuccess = SetCommState(hCom, &dcb);
Persönliche Seite #249823
Lesenswert?

"Kann ich den FT232 als virtuellen COM Port so initialisieren, dass er
CTS verwendet ?"

Das sollte sich exakt genauso verhalten wie bei einer "echten"
seriellen Schnittstelle. Also Hardwarehandshake einschalten, genauso,
wie Du es in der Zeile

  dcb.fOutxCtsFlow = TRUE;

auch machst.

Dieses Flag ist so beschrieben:

  fOutxCtsFlow
    Indicates whether the CTS (clear-to-send) signal is
    monitored for output flow control. If this member is
    TRUE and CTS is turned off, output is suspended until
    CTS is sent again.


Viel Erfolg.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren