ayuda sobre string y puerto serial....
Publicado por richard sandi (4 intervenciones) el 27/03/2012 23:31:54
Buenas Tardes Amigos...
Verán estoy con un proyecto de la universidad sobre la comunicación serial y me conseguí un componente con el código que realiza esta función, así que me ha sido muy útil, he aprendido mucho del código he podido realizar muchas mas cosas con el... Pero necesito hacer lo siguiente y pues no he podido.
Resulta que cuando viene algo por el puerto de comunicación se genera un string el cual se añade a un memo para mostrar el string de comunicación o trama..
En el string vienen caracteres específicos de comunicación y deseo poder leer estos caracteres y agregarles un texto por ejemplo ,
ejemplo original
richard sandi 23 /12 / 2012 aula numero 15
ejemplo que deseo hacer
richard sandi <RS><GS> 23/ 12/ 2012 aula numero 15 <EOT>
El caracter ascii 04 corresponde a <EOT>
30 corresponde a <RS>
29 corresponde a <GS>
estos caracteres vienen en código ascii la trama de comunicación, pero cada vez que los identifico no me salen dentro del nuevo string que deseo generar..
Les adjunto el código.... a ver si alguien me puede echar una mano y así pues aprendo sobre strings...
saludos y muchas gracias de antemano...
// Codigo Original
// Se define el tamaño del String
procedure AddHexString(S : String; Lines : TStrings );
var AddS, CopyS : String;
i : Integer;
const SLen = 200;
begin
while Length(S) > 0 do
begin
AddS := Copy(S,1,SLen);
Delete(S,1,SLen);
while Length(AddS) < SLen do
AddS := AddS + ' ';
for i := 1 to SLen do
case AddS[i] of
#02 : begin
form1.MemoRecepcion.Text:='<STX>';
end;
#03 : begin
form1.MemoRecepcion.Text:='<ETX>';
end;
#04 : begin
form1.MemoRecepcion.Text :='<EOT>';
form1.MemoRecepcion.Text :='<EOT>';
AddS:= Adds + '<EOT>';
end;
#05 : begin
form1.MemoRecepcion.Text :='<ENQ>';
envioACK; // se envia un Ack
end;
#06 : begin
form1.MemoRecepcion.Lines.Add(Adds);
form1.MemoRecepcion.Text :='<ACK>';
AddS:= Adds + '<ACK>';
end;
#29 : begin
form1.MemoRecepcion.Text:='<GS>';
envioACK; // se envia un Ack
end;
end;
Lines.Add(AddS);
end;
end;
procedure TForm1.AdvSettingsBtnClick(Sender: TObject);
begin
SerialNGAdvDLG.SetDLGData(SerialPortNG1);
if SerialNGAdvDLG.ShowModal = mrOK then
SerialNGAdvDLG.GetDLGData(SerialPortNG1);
if SerialPortNG1.Active then
SetLeds
else
ResetLeds;
end;
Aquí se recibe lo que viene en el puerto.....................
procedure TForm1.SerialPortNG1RxClusterEvent(Sender: TObject);
begin
if SerialPortNG1.NextClusterSize >= 0 then // Data available?
begin
if SerialPortNG1.NextClusterCCError = 0 then // Error during receiveing?
begin
memo1.Lines.Add(FormatDateTime('"Rec <--"hh:mm:ss" :"', Now));
end
else
memo1.Lines.Add(FormatDateTime('"RecX "hh:mm:ss" :"', Now));
// Read the data and patch them into the editfield
AddHexString(SerialPortNG1.ReadNextClusterAsString,memo1.Lines);
end;
end;
Verán estoy con un proyecto de la universidad sobre la comunicación serial y me conseguí un componente con el código que realiza esta función, así que me ha sido muy útil, he aprendido mucho del código he podido realizar muchas mas cosas con el... Pero necesito hacer lo siguiente y pues no he podido.
Resulta que cuando viene algo por el puerto de comunicación se genera un string el cual se añade a un memo para mostrar el string de comunicación o trama..
En el string vienen caracteres específicos de comunicación y deseo poder leer estos caracteres y agregarles un texto por ejemplo ,
ejemplo original
richard sandi 23 /12 / 2012 aula numero 15
ejemplo que deseo hacer
richard sandi <RS><GS> 23/ 12/ 2012 aula numero 15 <EOT>
El caracter ascii 04 corresponde a <EOT>
30 corresponde a <RS>
29 corresponde a <GS>
estos caracteres vienen en código ascii la trama de comunicación, pero cada vez que los identifico no me salen dentro del nuevo string que deseo generar..
Les adjunto el código.... a ver si alguien me puede echar una mano y así pues aprendo sobre strings...
saludos y muchas gracias de antemano...
// Codigo Original
// Se define el tamaño del String
procedure AddHexString(S : String; Lines : TStrings );
var AddS, CopyS : String;
i : Integer;
const SLen = 200;
begin
while Length(S) > 0 do
begin
AddS := Copy(S,1,SLen);
Delete(S,1,SLen);
while Length(AddS) < SLen do
AddS := AddS + ' ';
for i := 1 to SLen do
case AddS[i] of
#02 : begin
form1.MemoRecepcion.Text:='<STX>';
end;
#03 : begin
form1.MemoRecepcion.Text:='<ETX>';
end;
#04 : begin
form1.MemoRecepcion.Text :='<EOT>';
form1.MemoRecepcion.Text :='<EOT>';
AddS:= Adds + '<EOT>';
end;
#05 : begin
form1.MemoRecepcion.Text :='<ENQ>';
envioACK; // se envia un Ack
end;
#06 : begin
form1.MemoRecepcion.Lines.Add(Adds);
form1.MemoRecepcion.Text :='<ACK>';
AddS:= Adds + '<ACK>';
end;
#29 : begin
form1.MemoRecepcion.Text:='<GS>';
envioACK; // se envia un Ack
end;
end;
Lines.Add(AddS);
end;
end;
procedure TForm1.AdvSettingsBtnClick(Sender: TObject);
begin
SerialNGAdvDLG.SetDLGData(SerialPortNG1);
if SerialNGAdvDLG.ShowModal = mrOK then
SerialNGAdvDLG.GetDLGData(SerialPortNG1);
if SerialPortNG1.Active then
SetLeds
else
ResetLeds;
end;
Aquí se recibe lo que viene en el puerto.....................
procedure TForm1.SerialPortNG1RxClusterEvent(Sender: TObject);
begin
if SerialPortNG1.NextClusterSize >= 0 then // Data available?
begin
if SerialPortNG1.NextClusterCCError = 0 then // Error during receiveing?
begin
memo1.Lines.Add(FormatDateTime('"Rec <--"hh:mm:ss" :"', Now));
end
else
memo1.Lines.Add(FormatDateTime('"RecX "hh:mm:ss" :"', Now));
// Read the data and patch them into the editfield
AddHexString(SerialPortNG1.ReadNextClusterAsString,memo1.Lines);
end;
end;
Valora esta pregunta


0