Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: UART Terminal-Programm zur Kommunikation mit ATmega8 µC

  Alt 1. Feb 2007, 20:37
Zitat von Manado:
OK noch eine Mini-Frage, weils grad so gut klappt (*freu*):
Das freut mich!

Zitat von Manado:
mit ComPort.ReadStr(String,Zahl); lese ich den Com port ab. Das klappt auch, nur wie kann ich sagen, wie lange er lesen soll, bzw. Zeichen empfangen?
Dazu kannst Du einfach mit der Komponente abfragen, wieviele Zeichen gerade im Puffer liegen. An sich ist die Kommunikation über RS-232 immer Asynchron. Du weißt also nicht wann Daten übertragen werden und/oder wieviele. Auch kannst Du nicht direkt auf ein Datum antworten. Das alles gilt nur für die RS-232 Schnittstelle. Das heißt in diesem Fall insbesondere, dass Du ohne Probleme ein Protokoll auf RS-232 aufsezten kannst, dass Dir all diese Möglichkeiten gibt. In der Regel gibt es zwei Möglichkeiten mit dem µC zu kommunizieren:
  1. Endlosschleife (z.B. Messwerte lesen), man stößt das Lesen einmal an und es werden (wie in deinem Test) ständig Daten gesendet und Empfangen
  2. Ereignisse, Du stellst gezielt Anfragen und musst ggf. (hängt vom Protokoll ab) auch mal Antworten.

Da die Kommunikation asynchron ist, werden die Daten dabei immer gepuffert. Der Controller weiß nie, ob er ein vollständiges Datum oder nur einen Teil übertragen hat (das Problem hast Du gerade). Deswegen wird häufig ein spezielles Zeichen als EOT (End of Transmission) übertragen (nicht mit gleichnamigem Steuerzeichen verwechseln!). Ich meine hier, dass Du selbst festlegst, dass Zeichen X das Ende eines Datums markiert. Üblicherweise nimmt man das Zeichen CR (Carriage Return/$D/0xD/13/Enter). Es handelt sich um den einfachen Zeilenumbruch (Return/Enter), die Nummern 13, die Hex-Zahl $D (Delphi Syntax) oder 0xD (C/Java Syntax) stellen dabei den Wert des Zeichens dar.
Der TComport bietet Dir die Eigenschaft EventChar. Hier ist etwas wie #0 voreingestellt. Die # steht dafür, dass Du den Buchstaben mit dem Byte-Wert nimmst (entspricht der chr-Funktion). Für CR kannst Du hier also #13 eintragen. Wird nun ein CR empfangen, so wird das Ereignis OnRxFlag ausgelöst (also genauer die Behandlung des Ereignisses). Verwendest Du das allgemeine OnRxChar, wird die Anzahl der Daten im Puffer mit übergeben. Beim OnRxFlag-Event ist das nicht der Fall. Hier kannst Du die Anzahl der Bytes im Puffer (wie auch an jeder anderen Stelle) mit der Funktion InputCount abfragen. Diese Funktion gibt Dir einfach nur die Anzahl der Bytes im Puffer zurück. Diese Anzahl kannst Du also in einen Puffer einlesen.
Das eigentliche Problem bleibt hier noch das Trennen, Du weißt zwar, dass ein Datum mit einem CR endet (man kann natürlich auch ein Startzeichen festlegen!), aber Du weißt eben nicht, ob nicht bereits Teile des nachfolgenden Datums mit im Puffer liegen. Deswegen solltest Du hier einfach die Daten in eine Instanzvariable schreiben. Damit meine ich eine Variable, die innerhalb der Instanz der Klasse global ist (z.B. unter private angelegt). In diese Variable kannst Du einfach den Inhalt des Puffers einlesen und mittels Pos und Copy das erste Datum kopieren. Hier könntest Du dann z.B. in einer Schleife solange weiter machen, bis kein Trennzeichen mehr im String ist. Dafür findest Du aber auch fertige Klassen (such mal nach Hier im Forum suchenexplode oder so).
Wichtig ist einfach, dass Du den letzten Teil (das noch unfertige Datum) einfach noch behälst, wenn es nicht mit einem Trennzeichen endet.

Letztlich bleibt es aber vollkommen Dir überlassen, wie Du das hier machst. Immerhin kannst Du das komplette Protokoll festlegen. Wie gesagt, eine Möglichkeit besteht in Start- und Endzeichen. Du kannst aber natürlich noch die Anzahl der Bytes / Größe des Datums, eine Checksumme, Bestätigungen und und und verschicken. Wichtig ist nur, dass beide Kommunikationspartner wissen welche Form ein Datum hat (sonst hast Du halt nur eine sinnlose Menge von Bytes).

Zitat von Manado:
ALSO : Wie kann ich eine Bedingung programmieren, ab wann er lesen soll, un dwie kann ich programmieren, das er z.b 8 Zeichen lesen soll und im String speichern. ?????
Ja, was das lesen von 8 Zeichen angeht, so musst Du halt nur prüfen ob InputCount >= 8 ist und das dann bei Count angeben. Wichtig ist halt, dass Du nicht schon liest, wenn nur 3 Zeichen im Puffer liegen. Wieviele Bytes tatsächlich gelesen wurden ist natürlich das Funktionsergebnis (von readStr).

Gruß (und auch Dir 'nen schönen Abend!) Der Unwissende
  Mit Zitat antworten Zitat