Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Serielle Schnittstelle mit Handshake Kategorie: Sonstige Hardware (von thomas - 2.04.2004 20:26)
Als Antwort auf Serielle Schnittstelle mit Handshake von Johannes - 1.04.2004 21:09
Ich nutze:
C-Control II Unit, C-Control II Station, OSOPT V3.0
Hallo Johannes,

ich bin ein wenig genervt, weil ich das Ganze schon mal eingegeben habe, durch Verbindungsverlust
beim Senden aber verloren ging. Also nocheinmal:

Was mir zu Deinen Zeilen einfällt:

1) 4 Longwerte => 4 x 4Byte = 16 Byte !? Oder sendest Du die Zahlen als String? Wohl JA.

2) Zeichen dürften Dir eigentlich nur verloren gehen, wenn die Anzahl Byte 64 übersteigt. Im Handbuch
steht über die serielle Schnittstelle folgendes:
"Das Betriebssystem implementiert für beide seriellen Schnittstellen (Anm: hwcom + swcom) standard-
mä�ig je einen Empfangspuffer von 64 Byte. In Applikationen, in denen grö�ere Datenblöcke zu
empfangen sind, sollte ein erweiterter Empfangspuffer reserviert werden."
Dieses Reservieren wird mit Hilfe folgender Funktion durchgeführt:
function setbuf ( byte buf[], int length )

Du musst also eine globale/statische Variable mit ausreichend Platz definieren und der Funktion
übergeben. (Hab ich selbst allerdings noch nicht ausprobiert.)

Wie stellst Du eigentlich sicher, dass bei der Ã?bertragung kein Fehler aufgetreten ist? Und was
machst Du falls dies passiert? Also ein gewisses Handshaking muÃ?t Du doch sowieso vornehmen!


Hier noch ein Tip:
=============
Beim Senden von Daten über die serielle Schnittstelle sind einige Fu�angeln zu beachten. Sendest
Du kurz hintereinander einzelne Strings, dann kommt am anderen Ende nur "MIST" an!

Also, wenn Du z.B. folgendes machst:

  hwcom.print("Hallo ");
  hwcom.print("Du ");
  hwcom.print("Da!");
  hwcom.ret();

dann kommt am anderen Ende nur folgendes an:
"HaDa!Da!"
Dies ist abhängig von der eingestellten �bertragungsrate und dem Zufall.

Eigentlich dürfte dies nicht passieren, da in den Routinen im Modul "hwcom" (Version 1.3)
wait-Aufrufe vorhanden sind. Allerdings werden diese anscheinend nicht ausgeführt!!
(Dies hat wohl noch keiner gemerkt. Zu diesem Thema werde ich gleich noch einen neuen Thread
aufmachen.)
Also mu�t Du die wait-Aufrufe selbst einfügen:

  hwcom.print("Hallo ");
  wait hwcom.ready();
  hwcom.print("Du ");
  wait hwcom.ready();
  hwcom.print("Da!");
  wait hwcom.ready();
  hwcom.ret();
  wait hwcom.ready();

Kann allerdings sein, da� dieses Problem mit einem älteren OS und älteren Modulen noch nicht auftritt.
Probiers mal aus.

Bei Verwendung einer String-Variablen würde allerdings auch eine funktionierende send-
Funktion nichts helfen:

  string s;   // globale Stringvariable

  s = "Hallo ";
  hwcom.send(s, str.length(s));
  s = "Du ";
  hwcom.send(s, str.length(s));
  s = "Da!";
  hwcom.send(s, str.length(s));
  hwcom.ret();


Hier ist das Problem, das die send-Funktion die Zeichen aus der Varialben im Hintergrund
sendet. Ist noch nicht alles gesendet und wird der Variablen ein neuer Wert zugewiesen, dann
passiert wieder unvorhergesehenes.

Ich hoffe dies hat Dir ein wenig weitergeholfen,

GruÃ?
Thomas


> Moin,
> ich habe folgendes Problem. Ich möchte über die serielle Schnittstelle mit einem Visual Basic
> Programm kommunizieren. Zu einem Datenpacket sollen 4 Longwerte plus einem Command (String)
> gehören. Da die vier Longwerte nicht in einen String von 30 Zeichen passen, sende ich 4 Mal über
> die Schnittstelle. Auf dem Rechner bzw. auf der CC2 werden die vier Werte dann entgegengenommen
> zusammen weiterverarbeitet.
>
> Das Problem ist nun, dass das Visual Basic programm beim Senden die vier Werte zu schnell
> hintereinander übermittelt. Mein Programm kommt da nicht hinterher, einen Wert abzuspeichern, da
> kommt schon der nächste. Aus diesem Grund habe ich selbst eine Art Handshake programmiert. Dabei
> wird nach dem Empfang eines Wertes ein ":" zum Sender (PC) zurückgesendet, und erst wenn dieser
> es empfängt, sendet er den nächsten Wert.
>
> Leider ist dieses Verfahren zu langsam, da ich relativ viel übertragen möchte. Für ein Datenpacket braucht er
> über eine Sekunde. Habt Ihr eine Idee, wie ich das lösen könnte?
> Ich habe mir jetzt überlegt, dieses RTS zu verwenden. Allerdings verstehe ich nicht
> ganz (die Anleitung hab ich gelesen! :-) ), wie das mit der CC2 funktionieren soll.
>
> Ist es aufwendig, so ein RTS-Handshake zu realisieren? Wäre schön, wenn ihr mir da helfen könntet.
> Ich habe nämlich das Gefühl, dass ich sonst zu viele Resourcen verschwende, wenn ich bei meinem
> eigenen Handshake bleibe.
>
> GruÃ?
> Johannes


    Antwort schreiben


Antworten:

Re: Serielle Schnittstelle mit Handshake (von Johannes - 2.04.2004 21:19)
    Re: Serielle Schnittstelle mit Handshake (von André H. - 4.04.2004 11:15)
        Re: Serielle Schnittstelle mit Handshake (von Johannes - 5.04.2004 14:04)
            Re: Serielle Schnittstelle mit Handshake (von André H. - 10.04.2004 10:00)
    Re: Serielle Schnittstelle mit Handshake (von Johannes - 3.04.2004 13:48)