PDA

Ver la Versión Completa : Eliminar caracteres extraños obtenidos por puerto serie


Sr.Scorpion
17-10-2008, 21:28:26
Hola

Uso Delphi 6.0 y el componente ComPort, estoy adquiriendo datos de una pizarra telefonica y los pongo en un memo pero me salen caracteres extraños como un palito bien negro... caracter q no salia cuando capturaba la informacion por el Hyperterminal alguien me puede decir como eliminar eso ?

Saludos de antemano

egostar
17-10-2008, 21:33:17
Hola

Uso Delphi 6.0 y el componente ComPort, estoy adquiriendo datos de una pizarra telefonica y los pongo en un memo pero me salen caracteres extraños como un palito bien negro... caracter q no salia cuando capturaba la informacion por el Hyperterminal alguien me puede decir como eliminar eso ?

Saludos de antemano

Hola,

Así sin ver, me podria aventurar que son caracteres de control que van desde el Null (ASCII 0) hasta el US (ASCII 31), si colocas el código con el cual estas recibiendo datos, te podriamos ayudar mejor.

Salud OS

mario2000
19-10-2008, 00:36:09
probablemente es la velocidad con la que envias los datos.
yo siempre coloco este codigo y me sale todo bien:

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
dato:string;
begin
comport1.Readstr(dato,3);
memo1.Lines.Text:=memo1.Lines.Text+dato;
end;

tienes que seleccionar el evento rxchar y lo pones asi como te dije veras que si funciona si quieres te envio uno que tengo armado y funcionando :)

JoseFco
19-10-2008, 01:33:40
Hola

Uso Delphi 6.0 y el componente ComPort, estoy adquiriendo datos de una pizarra telefonica y los pongo en un memo pero me salen caracteres extraños como un palito bien negro... caracter q no salia cuando capturaba la informacion por el Hyperterminal alguien me puede decir como eliminar eso ?

Saludos de antemano

Pon el codigo a ver que se le encuentra.;)

Un Saludo.

Sr.Scorpion
20-10-2008, 16:03:30
Los caracteres en rojo son los q me salen, si hago un ShowMessage con el Texto q se lee desde el puerto me sale como un simbolo de un cuadrito.

10/20/08 10:46AM 219 01 2047564219 00:00'15 1771
10/20/08 10:46AM 222 01 8811345 00:02'30 6416

El codigo q utilizo es este:


procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
str: string;
begin
ComPort.ReadStr(Str, Count);
ShowMessage(Str);
Memo.Text := Memo.Text + Str;
end;


Saludos y gracias

Lepe
20-10-2008, 18:37:42
A mí lo que me gustaría saber es ¿cómo has puesto ese caracter en el foro? :D

En serio, parece que pone 0013... y 13 es el símbolo ASCII de retorno de línea, en windows es muy común el caracter 10 seguido del 13 que viene a significar retorno de carro y retorno de linea. Su representación:
- en delphi str := #10#13;
- En hexadecimal $A$D
- En C y en otros lenguajes se suelen usar constantes CR (Carry Return) y LF (Line Feed??)

para eliminarlos podrías usar cualquier función de delphi:

str := ReplaceStr(lacadena, #13, ' ', [rfReplaceAll]);


Espero sea eso. Saludos

mario2000
20-10-2008, 19:44:58
Hola en count tienes que poner un entero pequeño de 1 a 10 es la cantidad de caracteres que vas a recivir.

egostar
20-10-2008, 20:02:35
Hola en count tienes que poner un entero pequeño de 1 a 10 es la cantidad de caracteres que vas a recivir.

No no, el parámetro count es precisamente los caracteres recibidos en el puerto, como dice Lepe, deberás de precisar cuales son los caracteres "raros" para que los reemplaces.

Salud OS

mario2000
20-10-2008, 20:15:29
Hola egostar, siento dicentir un poco con eso, pero el manual dice comport lo dice.

ahora viejo el no deberia recivir caracteres extraños si en otro programa no le salen por que en el de el iban a salir, es mas le voy a hacer un ejemplo y se los subo, yo no soy experto es lo que mas me gustaria pero asi es como siempre lo he hecho y funciona perfectamente :eek:

egostar
20-10-2008, 20:39:19
Hola egostar, siento dicentir un poco con eso, pero el manual dice comport lo dice.

ahora viejo el no deberia recivir caracteres extraños si en otro programa no le salen por que en el de el iban a salir, es mas le voy a hacer un ejemplo y se los subo, yo no soy experto es lo que mas me gustaria pero asi es como siempre lo he hecho y funciona perfectamente :eek:

Hola,

Podriamos debartirlo, pero es muy claro, te explico, cuando tu lees datos del puerto serial tienes dos alternativas, que uses el evento OnRxChar (que es el evento que nos ocupa en este caso) o desde cualquier punto de tu programa, por ejemplo en un botón.

Si usas el evento onRxChar del ComPort debes de leer en base a los caracteres recibidos, que para eso es el parámetro Count.


procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
ComPort1.ReadStr(Str, Count);
end;


Si lees por ejemplo al presionar un boton, entonces si, puedes indicar cuantos caracteres quieres leer.


Procedure LeePuerto;
var
Str: String;
begin
ComPort1.ReadStr(Str, 127);
end;


Y si tienes alguna duda, lee bien el manual del ComPort, en especifico la sección Reading from port

Salud OS

mario2000
20-10-2008, 21:39:49
Bueno egostar tu sabes mas que yo, debes tener razon. :), yo tambien reviso a ver lo que tu dices y gracias por las aclaraciones :D

Sr.Scorpion
21-10-2008, 14:45:59
A mí lo que me gustaría saber es ¿cómo has puesto ese caracter en el foro? :D

En serio, parece que pone 0013... y 13 es el símbolo ASCII de retorno de línea, en windows es muy común el caracter 10 seguido del 13 que viene a significar retorno de carro y retorno de linea. Su representación:
- en delphi str := #10#13;
- En hexadecimal $A$D
- En C y en otros lenguajes se suelen usar constantes CR (Carry Return) y LF (Line Feed??)

para eliminarlos podrías usar cualquier función de delphi:
Código Delphi [-] (http://www.clubdelphi.com/foros/#) str := ReplaceStr(lacadena, #13, ' ', [rfReplaceAll]);


Espero sea eso. Saludos

La funcion ReplaceStr es propia de Delphi, API ???? o es una funcion q implementastes tu

Saludos

Delphius
21-10-2008, 15:43:19
La funcion ReplaceStr es propia de Delphi, API ???? o es una funcion q implementastes tu

Saludos
Hola Sr.Scorpion,
Esa función ya viene en Delphi. Para saber más sobre la función escribe su nombre, seleccionalo y presiona F1. Debería aparecerte la ayuda sobre dicha función.

Saludos,

Sr.Scorpion
21-10-2008, 15:48:32
Hola Sr.Scorpion,
Esa función ya viene en Delphi. Para saber más sobre la función escribe su nombre, seleccionalo y presiona F1. Debería aparecerte la ayuda sobre dicha función.

Saludos,

Lo q me dices fue lo primero q hice le di F1 a la funcion y me sale un ReplaceText con parametros totalmente diferentes. OJO estoy usando Delphi 6

Saludos

egostar
21-10-2008, 17:29:40
Lo q me dices fue lo primero q hice le di F1 a la funcion y me sale un ReplaceText con parametros totalmente diferentes. OJO estoy usando Delphi 6

Saludos

Hola,

Tienes razón no es ReplaceStr() es StringReplace()


type
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);

function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;


Salud OS

Lepe
21-10-2008, 18:14:30
gracias amigos, ya nos habéis sacado del apuro.

Nunca acierto con el nombre de esa rutina, es mi talón de aquiles... (y la vejez que no perdona :D).

Saludos

Sr.Scorpion
21-10-2008, 20:14:25
Hola,

Tienes razón no es ReplaceStr() es StringReplace()

Código Delphi [-] (http://www.clubdelphi.com/foros/#)type TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase); function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;


Salud OS


Disculpen mi ignorancia con esta funcion.... alguien puede postear un ejemplo de esta funcion... algo tengo q estar haciendo mal, q no hay manera q me compile el Delphi

Saludos

maeyanes
21-10-2008, 21:07:37
Hola...

¿Te da algún error? ¿Cuál? Ponlo aquí para que te podamos ayudar mejor...



Saludos...

Sr.Scorpion
21-10-2008, 21:15:47
Hola...

¿Te da algún error? ¿Cuál? Ponlo aquí para que te podamos ayudar mejor...


Saludos...

Aqui va el codigo q tengo puesto... me imagino q sea algun error de concepto.


type
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
TForm1 = class(TForm)
ComPort: TComPort;
Memo: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ComPortRxChar(Sender: TObject; Count: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation

{$R *.dfm}


procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
Flags: TReplaceFlags;
str,cadena: string;
begin
ComPort.ReadStr(cadena, Count);
str:= StringReplace(cadena, '#13', '', Flags);
ShowMessage(Str);
Memo.Text := Memo.Text + Str;
end;



La cadena en rojo es la q me da el error y me dice Error [50] Incompatible types

Mil gracias de antemano

maeyanes
21-10-2008, 21:22:17
Hola...

Prueba así:


str:= StringReplace(cadena, #13, '', Flags);


Fijate que #13 no está encerrado entre comillas...


Saludos...

JoseFco
21-10-2008, 21:28:53
Hola egostar, siento dicentir un poco con eso, pero el manual dice comport lo dice.

ahora viejo el no deberia recivir caracteres extraños si en otro programa no le salen por que en el de el iban a salir, es mas le voy a hacer un ejemplo y se los subo, yo no soy experto es lo que mas me gustaria pero asi es como siempre lo he hecho y funciona perfectamente :eek:

Sigo esperando el ejemplo amigo.:confused:


Un Saludo.

PD:En el Hyperterminal terminal no sale porque tiene un filtro para no mostrarlo.(elimina ese caracter)

egostar
21-10-2008, 21:43:50
Disculpen mi ignorancia con esta funcion.... alguien puede postear un ejemplo de esta funcion... algo tengo q estar haciendo mal, q no hay manera q me compile el Delphi


Hola


procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
cadena: string;
begin
ComPort.ReadStr(cadena, Count);
cadena := StringReplace(cadena, #13, '', [rfReplaceAll]);
ShowMessage(cadena);
Memo.Text := Memo.Text + cadena;
end;


Salud OS

maeyanes
21-10-2008, 21:46:17
Hola...

Solo que te confundiste al hacer el quote... :D :D


Saludos...

Sr.Scorpion
22-10-2008, 14:56:21
Probe tu sentencia y me dice Incompatibles types.... no creo q esa sea la solucion.... hay algo q tener hecho mal cuando declaro Flags o algo por el estilo

Saludos

Sr.Scorpion
22-10-2008, 15:02:19
Hola

Código Delphi [-] (http://www.clubdelphi.com/foros/#)procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer); var cadena: string; begin ComPort.ReadStr(cadena, Count); cadena := StringReplace(cadena, #13, '', [rfReplaceAll]); ShowMessage(cadena); Memo.Text := Memo.Text + cadena; end;


Salud OS


cadena := StringReplace(cadena, #13, '', [rfReplaceAll]);

Incompatible types de nuevo

Delphius
22-10-2008, 15:23:47
Código Delphi [-] (http://www.clubdelphi.com/foros/#)cadena := StringReplace(cadena, #13, '', [rfReplaceAll]);

Incompatible types de nuevo
Hola Sr.Scorpion,
Si leyeras un poco la ayuda sobre StringReplace sabrías que el error es bastante sencillo de resolver: le faltan las comillas simples a #13. Es decir que es: '#13'.

Mayenaes unos post antes lo ha comentado.

Saludos,

Sr.Scorpion
22-10-2008, 15:31:08
Hola Sr.Scorpion,
Si leyeras un poco la ayuda sobre StringReplace sabrías que el error es bastante sencillo de resolver: le faltan las comillas simples a #13. Es decir que es: '#13'.

Mayenaes unos post antes lo ha comentado.

Saludos,


Hola Delphius

Si tu tambien leyeras un poco.... al principio del post mi sentencia era '#13' y me daba el mismo error (Incompatible types) segun los consejos de los miembros de este forums me dijeron q eliminara las comillas, cosa q hice y me sigue saliendo el mismo por eso lo he ido poniendo como ellos me lo han dicho

Saludos

maeyanes
22-10-2008, 15:42:42
Hola Sr.Scorpion,
Si leyeras un poco la ayuda sobre StringReplace sabrías que el error es bastante sencillo de resolver: le faltan las comillas simples a #13. Es decir que es: '#13'.

Mayenaes unos post antes lo ha comentado.

Saludos,

Hola...

Delphius, lo que yo hice fue corregirle de: '#13' a #13, o sea, le quité las comillas simples a su código...

Ahora, esto al menos a mi me compila bien, no se por que razón al compañero le da ese error...

Tal vez podría hacer algo como:


var
CharToReplace: string;
Cadena: string;

begin
CharToReplace := #13;
Cadena := StringReplace(cadena, CharToReplace, '', [rfReplaceAll]);
end;




Saludos...

Delphius
22-10-2008, 15:51:06
Es verdad, tienen razón.
Disculpa mi reacción Sr.Scorpion, no debí reacción asi.

A mi también me resulta raro que arroje un error allí.:confused:

Saludos,

JoseFco
22-10-2008, 16:28:33
Hola Sr.Scorpion,
Si leyeras un poco la ayuda sobre StringReplace sabrías que el error es bastante sencillo de resolver: le faltan las comillas simples a #13. Es decir que es: '#13'.

Mayenaes unos post antes lo ha comentado.

Saludos,

cadena := StringReplace(cadena, '#13', ' ', [rfReplaceAll]);


No les parece que despues de (cadena, #13, lo que debe ir es '' y no esto".Ojo que puede ser ese el problema. ' ' eso es lo que va no esto ".

Un Saludo.

Sr.Scorpion
22-10-2008, 16:34:14
Hola JoseFco para serte sincero no creo q ese sea el problema. Para mi ' ' es lo mismo q '', al final es una string, aqui pienso q el verdadero dolor de cabeza esta en el ultimo parametro, q no se pq diablos q me dice q son de tipos incompatibles. No obstante sigo a la espera de los gurus de este foro... a ver q dicen.

Saludos

maeyanes
22-10-2008, 17:14:40
Hola...

El último parámetro no tiene nada que ver, ahí espera un conjunto y eso es lo que le estás enviando...

Podrías hacerlo de otra forma si quieres:


var
CharToReplace: string;
Cadena: string;
Flags: TReplaceFlags;

begin
CharToReplace := #13;
Flags := [rfReplaceAll];
Cadena := StringReplace(cadena, CharToReplace, '', Flags);
end;


Pero para el caso es lo mismo... ;)


Saludos...

Lepe
22-10-2008, 17:27:41
Creo que alguna directiva de compilación está haciendo de las suyas. Acabo de probar de ambas formas en delphi 6.


var
Cadena, str: string;
begin
str := 'mio mio '+ #13 + 'mio';
Cadena := StringReplace(str, '#13','', []);
ShowMessage (cadena);
end;

Esto compila pero no funciona :eek:, En el showmessage se ve la cadena partida por el salto de linea.

Esto es lo que funciona correctamente:

var
Cadena, str: string;
begin
str := 'mio mio '+ #13 + 'mio';
Cadena := StringReplace(str, #13,'', []);
ShowMessage (cadena);
end;
Es decir, sin las comillas simples.

Al menos yo, en Project -> options -> compiler -> syntax options, tengo todo marcado excepto "complete boolean eval" y "@ typed operand".

Sin duda, algo se nos escapa cuando no le funciona.

Saludos.

JoseFco
22-10-2008, 17:45:16
Hola JoseFco para serte sincero no creo q ese sea el problema. Para mi ' ' es lo mismo q '', al final es una string, aqui pienso q el verdadero dolor de cabeza esta en el ultimo parametro, q no se pq diablos q me dice q son de tipos incompatibles. No obstante sigo a la espera de los gurus de este foro... a ver q dicen.

Saludos


Bueno tengan en cuenta que soy novato en esto, pero esto " = Shift+" y esto '' son dos ' ' .No estoy en mi pc asi que no tengo Delphi para poder comprobar si es lo mismo.

Un Salud.

Sr.Scorpion
22-10-2008, 19:57:22
Fin del asunto... muchas a todos en especial a Lepe

Como decia el gran Lepe

str:= StringReplace(Cadena, #13, '',[]);


Pero realmente si lo que quieres es eliminar los caracteres de los q habia hablado desde el principio tienes q poner #$13, por lo q la sentencia quedaria asi

str:= StringReplace(Cadena, #$13, '',[rfReplaceAll]);

Gracias una vez mas