Autor |
Beitrag |
Lago
      
Beiträge: 43
|
Verfasst: Di 03.01.06 13:13
Ich will Daten über den COM1 empfangen und habe hierzu eine procedure geschrieben. Wenn ich den Button zum ausführen dieser Procedure klicke, dann stürzt das Programm ab, resp macht keinen Wank mehr. Wieso?
Die Procedure sieht so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| procedure TForm1.empfangen; var i: integer; begin with CommPortDriver1 do begin repeat repeat ReadChar(ch); until ch = StartDelimiter; checksum := 27; ReadChar (ch); checksum := checksum + ord (ch); case ch of 'Z': begin n := 16; msgType := 'Position'; end; 'W': begin n := 5; msgType := 'Druckknopf'; end; 'U': begin n := 1; msgType := 'Zeitabgelaufen'; end; end; SetLength (msg, n); for i := 1 to n do begin ReadChar (ch); checksum := checksum + ord (ch); msg [i] := ch; end; ReadChar (ch); until ord (ch) = checksum mod 256; end; end; |
Ich habe ein Programm geschrieben, welches Daten sendet... und das funktioniert. (Mit Teraterm getestet).
Es könnte auch sein das er sich an der Repeat-Schleife aufhängt... Aber wie wird das normal erledigt mit dem Empfangen der Daten? Verwendet man da eine bestimmte Vorgehensweise?
Danke jetzt schon,
Pascal
|
|
Martin1966
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Di 03.01.06 13:26
Was passiert denn wenn die folgende Repeat-Anweisung nie verlassen wird weil zum Beispiel das Startzeichen einfach nicht kommt?
Delphi-Quelltext 1: 2: 3:
| repeat ReadChar(ch); until ch = StartDelimiter; |
_________________ Ein Nutzer der Ecke
|
|
matze.de
      
Beiträge: 576
Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
|
Verfasst: Di 03.01.06 13:29
Martin1966 hat folgendes geschrieben: | Was passiert denn wenn die folgende Repeat-Anweisung nie verlassen wird weil zum Beispiel das Startzeichen einfach nicht kommt?
Delphi-Quelltext 1: 2: 3:
| repeat ReadChar(ch); until ch = StartDelimiter; | |
Ja, geb ich dir auch recht  Könntest du ja einen Timeout einbauen.
mfg matze
_________________ si tacuisses, philosophus mansisses.
|
|
Lago 
      
Beiträge: 43
|
Verfasst: Di 03.01.06 14:13
Ich habe anstelle dieses Programms TeraTerm laufen gelassen... Da wird ja angezeigt, was über die RS232 empfangen wird.
Es wird alles richtig Empfangen, d.h. auch mein Programm sollte dieses Startzeichen bekommen....
Wie müsste ich dieses Timeout einbauen?
Mein Programm sollte permanent Daten empfangen... (Dient als Schnittstelle zwischen meinem Schachcomputer und dem Brett)
www.hsr-chess-05.ch.vu
|
|
Martin1966
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Di 03.01.06 14:31
Aber irgendwie willst du doch das Problem lösen, oder? Das geht jedenfalls nicht wenn man immer davon ausgeht, dass alles klappen "sollte".
Also, am besten gehest du einfach davon aus, dass jede Zeile einen Fehler verursachen kann oder einfach anders läuft als Du denkst.
Die von mir gepostete Sourcecode-Stelle war halt das erste was mir auffiel.
Gibt die Funktion ReadChar ein Funktionergebnis zurück welches du eventl auswerten kannst?
Lg Martin
_________________ Ein Nutzer der Ecke
|
|
Lago 
      
Beiträge: 43
|
Verfasst: Mi 04.01.06 10:47
Ich habe jetzt einer meiner vielen Fehler erkannt...
Die funktion ReadChar() gibt mir nicht einen Buchstaben zurück, sondern ein True oder False...
Wenn ich jetzt also diese Procedure schreibe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.empfangen2; var ch: boolean; C: char; begin C:= 'Q'; repeat ch:= CommPortDriver1.ReadChar(C) until ch = true; end; |
und dann ein 'Q' sende... dann geht es wieder...
Nun stellt sich eine ganz andere Frage... Gibt es überhaut eine möglichkeit einen Buchstaben zu lesen? Wenn ja, wie heisst die Procedure?
Habe alle möglichkeiten einmal angeschaut...Für mich nur Bahnhof.
Kennt sich jemand mit der TCommPortDriver-Komponente aus?
|
|
Lago 
      
Beiträge: 43
|
Verfasst: Mi 04.01.06 11:10
Ich erlaube mir noch die Procedures/Functions/dieser Komponente zu Posten:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148:
| procedure SetHandle( Value: HFILE ); procedure SetPort( Value: TPortNumber ); procedure SetPortName( Value: string ); procedure SetBaudRate( Value: TBaudRate ); procedure SetBaudRateValue( Value: DWORD ); procedure SetDataBits( Value: TDataBits ); procedure SetStopBits( Value: TStopBits ); procedure SetParity( Value: TParity ); procedure SetHwFlowControl( Value: THwFlowControl ); procedure SetSwFlowControl( Value: TSwFlowControl ); procedure SetInBufSize( Value: DWORD ); procedure SetOutBufSize( Value: DWORD ); procedure SetPacketSize( Value: smallint ); procedure SetPacketTimeout( Value: integer ); procedure SetPollingDelay( Value: word ); function ApplyCOMSettings: boolean; procedure TimerWndProc( var msg: TMessage ); public constructor Create( AOwner: TComponent ); override; destructor Destroy; override;
function Connect: boolean; procedure Disconnect; function Connected: boolean; function GetLineStatus: TLineStatusSet; function IsPolling: boolean; procedure PausePolling; procedure ContinuePolling; function FlushBuffers( inBuf, outBuf: boolean ): boolean; function CountRX: integer; function OutFreeSpace: word; function SendData( DataPtr: pointer; DataSize: DWORD ): DWORD; function SendDataEx( DataPtr: pchar; DataSize, Timeout: DWORD ): DWORD; function SendByte( Value: byte ): boolean; function SendChar( Value: char ): boolean; function SendString( s: string ): boolean; function SendZString( s: pchar ): boolean; function ReadData( DataPtr: pchar; MaxDataSize: DWORD ): DWORD; function ReadByte( var Value: byte ): boolean; function ReadChar( var Value: char ): boolean; procedure ToggleDTR( onOff: boolean ); procedure ToggleRTS( onOff: boolean );
property Handle: HFILE read FHandle write SetHandle; published property Port: TPortNumber read FPort write SetPort default pnCOM2; property PortName: string read FPortName write SetPortName; property BaudRate: TBaudRate read FBaudRate write SetBaudRate default br9600; property BaudRateValue: DWORD read FBaudRateValue write SetBaudRateValue default 9600; property DataBits: TDataBits read FDataBits write SetDataBits default db8BITS; property StopBits: TStopBits read FStopBits write SetStopBits default sb1BITS; property Parity: TParity read FParity write SetParity default ptNONE; property HwFlow: THwFlowControl read FHwFlow write SetHwFlowControl default hfNONERTSON; property SwFlow: TSwFlowControl read FSwFlow write SetSwFlowControl default sfNONE; property InBufSize: DWORD read FInBufSize write SetInBufSize default 2048; property OutBufSize: DWORD read FOutBufSize write SetOutBufSize default 2048; property PacketSize: smallint read FPacketSize write SetPacketSize default -1; property PacketTimeout: integer read FPacketTimeout write SetPacketTimeout default -1; property PacketMode: TPacketMode read FPacketMode write FPacketMode default pmDiscard; property PollingDelay: word read FPollingDelay write SetPollingDelay default 50; property EnableDTROnOpen: boolean read FEnableDTROnOpen write FEnableDTROnOpen default true; property OutputTimeout: word read FOutputTimeOut write FOutputTimeout default 500; property InputTimeout: DWORD read FInputTimeOut write FInputTimeout default 200; property CheckLineStatus: boolean read FCkLineStatus write FCkLineStatus default false; property OnReceiveData: TReceiveDataEvent read FOnReceiveData write FOnReceiveData; property OnReceivePacket: TReceivePacketEvent read FOnReceivePacket write FOnReceivePacket; end;
function BaudRateOf( bRate: TBaudRate ): DWORD; function DelayForRX( bRate: TBaudRate; DataSize: DWORD ): DWORD; |
Readchar ist z.b. schon gut und recht... dann kann er aber nur einen bestimmten Char lesen... und gibt ein True zurück, wenn er diesen findt...
Ich will jedoch, dass er nach meinem Startdelimiter alle Char liest... und diese mir dann ausgibt.. Bin ja wohl nicht der erste, der das so machen will, oder? 
|
|
Martin1966
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Mi 04.01.06 11:31
Lago hat folgendes geschrieben: | Gibt es überhaut eine möglichkeit einen Buchstaben zu lesen? Wenn ja, wie heisst die Procedure? |
Äh? Das musst du doch wissen. Schließlich benutzt du schon so eine Funktion. -> ReadChar.
Lago hat folgendes geschrieben: | Ich will jedoch, dass er nach meinem Startdelimiter alle Char liest... und diese mir dann ausgibt.. |
Dafür wird es wohl nicht schon eine Funktion geben. Aber was ist denn mit dem Code den du schon geposetet hast? Dieser Code soll doch genau das machen. Erst nach einem bestimmten Zeichen suchen und ab dann die restlichen Zeichen ausgeben. Warum willst du jetzt etwas anderes benutzen als deinen Code?
Lg Martin
_________________ Ein Nutzer der Ecke
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 04.01.06 11:31
Hallo,
readchar liest doch einen Buchstaben.
// Reads a char. Returns true if char has been read
function ReadChar( var Value: char ): boolean;
Die Funktion gibt aber nur ein geaendertes Zeichen zurueck, wenn auch tatsaechlich etwas neues gekommen ist oder noch nicht aus dem Puffer gelesen wurde.
Du solltest OnReceiveData benutzen.
Wenn Daten kommen dann kannst Du diese einlesen und verarbeiten.
Sonst schlafen....
Gruss Horst
|
|
Lago 
      
Beiträge: 43
|
Verfasst: Mi 04.01.06 11:39
Guten Morgen Martin... Der Retter...
Das Problem ist, dass ich mit Readchar gemeint habe das einfach der nächste Char gelesenwird...
Es ist aber so, dass wenn ich ReadChar ausführe... dann wird nach einem bestimmten Char gesucht... und
sobald er diesen findet, läuft das Programm weiter.
Was in meinem Programm der Fall ist... jeder Startdelimiter ist der selbe... Was nachher kommt, weiss ich nicht.
Ich kann doch nicht jedes mal, jeden Buchstaben abfragen.... manchmal sind es 4Buchstaben die kommen.. manchmal 7..
|
|
Lago 
      
Beiträge: 43
|
Verfasst: Mi 04.01.06 11:42
Reads a char... Ja.. hmm.. OnRecieveData... ja....
Dann stimmt ja mein Programm trozdem... wenn ja ein Char gelesen wurde.. aber wieso liest er dann keinen?
Ich muss immer nach einem bestimmten Char suchen, damit das Programm wieder weiter läuft.
Probiere es gleich einmal aus.... Danke jetzt schon...
|
|
Lago 
      
Beiträge: 43
|
Verfasst: Mi 04.01.06 12:14
Mit OnRecieveData könnte es klappen... Habe einfache Abfragen gemacht... sieht soweit I.O. aus.
Danke!
|
|