Delphi XE3, Indy 10.5.9.0Delphi Indy IdTCPServer und IdTCPClient. Lesen und Schreiben von Steuerzeichen und Text
Ich erstelle eine Schnittstelle zwischen einem Computer und einem Instrument. Das Gerät verwendet das ASTM-Protokoll.
Ich habe erfolgreich textbasierte Nachrichten zwischen dem Server und dem Client hin und her gesendet. Ich war in der Lage, Steuerzeichen an den Server zu senden und diese zu lesen. Was ich nach 3 Tagen der Suche nicht herausgefunden habe, ist das Schreiben und Lesen von Nachrichten, die eine Mischung aus Steuerzeichen und Text enthalten.
Ich sende ASTM-Protokoll Nachrichten, die Steuerzeichen und Text wie die folgende Zeile erfordern. Alles in spitzen Klammern sind Steuerzeichen. Wenn ich die Nachricht schreibe, stoße ich nicht auf Probleme. Wenn ich es lese, werde ich sowohl Text- als auch Kontrollzeichen erhalten. Mein Code unten ist, wie ich die Steuerzeichen lese. Wie kann ich feststellen, wenn ich das Zeichen erhalte, ob es sich um ein Steuerzeichen handelt und ob es sich um Text in derselben Zeichenfolge aus Steuerzeichen und Textzeichen handelt? Danke an Remy Lebeau und seinen Beiträgen auf dieser Seite, um mich dahin zu bringen, wo ich bin. Er sprach darüber, wie man Puffer verwendet, aber ich konnte nicht sagen, wie man einen Puffer liest, der Steuerzeichen und Textzeichen enthält.
<STX>3O|1|G-13-00017||^^^HPV|R||||||N||||||||||||||O<CR><ETX>D3<CR><LF>
Ich habe hinzugefügt, um den folgenden Code zu meinen Server-Komponenten onConnect Ereignis, das sollte zu mir erlaubt, Steuerzeichen senden ...
...
AContext.Connection.IOHandler.DefStringEncoding := TIdTextEncoding.UTF8;
...
Mein Server OnExecute Ereignis ...
procedure TTasksForm.IdTCPServer1Execute(AContext: TIdContext);
var
lastline : WideString;
lastcmd : WideString ;
lastbyte : Byte ;
begin
ServerTrafficMemo.Lines.Add('OnExecute') ;
lastline := '' ;
lastcmd := '' ;
lastbyte := (AContext.Connection.IOHandler.ReadByte) ;
if lastbyte = Byte(5) then
begin
lastcmd := '<ENQ>' ;
ServerTrafficMemo.Lines.Add(lastcmd) ;
AContext.Connection.IOHandler.WriteLn(lastcmd + ' received') ;
end;
end;
Wow! Ich versuche all die guten Dinge in diesem Beitrag zu verdauen! Warum verwenden Sie $ in 'lastbyte =' Zeilen und # in ReadLn Zeilen? –
'lastbyte' ist ein Byte. '$ 5' ist ein numerischer Wert, äquivalent zu' Byte (5) ', einfach sauberer. 'ReadLn()' und 'WaitFor()' operieren auf Strings, nicht auf Bytes. '# 2' und' # 3' sind Zeichenwerte ('Char (2)' und 'Char (3)'). –
Gibt es eine Möglichkeit, eine Lese- oder Lesezeit "auszulöschen"? –