Conversion caractere en code ascii

Résolu
fox37 Messages postés 23 Date d'inscription dimanche 24 août 2003 Statut Membre Dernière intervention 11 février 2007 - 4 mars 2006 à 18:23
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 10 mars 2006 à 21:34
Bonjour a tous,

Comment faire pour convertir un caractère en code ascii?
Je m'explique : Je recois 3 caractères codés sur 1 octet chacuns par le port serie.
Je peux visualiser ces caractères dans un tedit.
Mais je voudrais en fait visualiser le code binaire de ce caractère afin de pouvoir obtenir sa valeur réelle.
par ex : je recois les caractères 1,2,3 qui correspondent normalement a 00110001,00110010,00110011
à partir de ce momment je voudrais pouvoir obtenir la conversion en décimal mais sur 3 octets : 001100010011001000110011 ==>2e0+2e1+2e4+2e5+2e9+2e12+2e13+2e16+2e20+2e21= à mon resultat qui s'affichera à l'ecran

Voila j'espère avoir été à peu près clair
Merci
Fabrice

29 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
8 mars 2006 à 13:50
quelle valeur a ton caractere nul? en effet s'il a été reçu par le port
serie il a obligatoirement une valeur.sinon il t'en manquera 1.

donc dans la boucle for to il suffit de tester la valeur de chaque
caractère et de remplacer celui "nul" par le caractère
espaceabel2.caption:= '';// on efface le label

var valeur: array[0..3]of byte;

for i: =1 to 3 do

begin

if length( edit1.text)then
begin

label2.caption:= label2.caption+'0';

valeur[i]=ord('0') ;//mets le caractere par défaut que tu veux

end else
begin

if edit1.text[i] =caracterenul then

label2.caption: = label2.caption+' ' //on remplace le caractère "nul" par l'espace

else

begin

label2.caption: =label2.caption+edit1.text[i];

valeur[i]=ord(edit1.text[i]);//ici on transtype le caractere dans le tableau c àd on cnvertit char en byte

end;

end;
end;



@+

jlen
0
fox37 Messages postés 23 Date d'inscription dimanche 24 août 2003 Statut Membre Dernière intervention 11 février 2007
8 mars 2006 à 14:49
Le caractère recut par le port serie est un octet compose de 8 zéros

(je ne compte bien sur pas le bitstart et le bitstop)

ce qui ne correpond a rien en ascii(peu etre un vide...)



Merci



Fabrice
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
8 mars 2006 à 15:29
c'est le caractère #0

constante caracterenul= 0;

donc

var valeur: array[0..3]of byte;

for i: =1 to 3 do

begin

if length( edit1.text)then
begin

label2.caption:= label2.caption+'0';

valeur[i]=ord('0') ;//mets le caractere par défaut que tu veux

end else
begin
if edit1.text[i] =caracterenul then// ou if edit1.text[i] = #0 then

label2.caption:= label2.caption+' ' //on remplace le caractère "nul" par l'espace

else

begin

label2.caption: =label2.caption+edit1.text[i];

valeur[i]=ord(edit1.text[i]);//ici on transtype le caractere dans le tableau c àd on cnvertit char en byte

end;

end;
end;

@+

jlen
0
fox37 Messages postés 23 Date d'inscription dimanche 24 août 2003 Statut Membre Dernière intervention 11 février 2007
8 mars 2006 à 17:30
Oui mais je pense que cela ne resout pas mon pb.



Car si je recois une sequence "1er carac""2eme carac""vide"



i sera = 3

en testant mon edit1.text il verra que edit1.text<3

donc il me remplira label2 a 0(00000000) alors que c'est label 3 qui devrait etre

a zero(00000000).(ais je bien compris ?)



en clair les différentes séquences qui peuvent arriver sont les suivantes.



aucun caractere ==>ok ca marche

"1er""2eme""3eme" ==> ok ca marche

"""2eme""3eme" ==> ok ca marche

"""""3eme" ==> ok ca marche



"1er""""3eme" ==> label2 doit etre a zero(00000000)

"1er""2eme""" ==> label3 doit etre a zero

"1er"""""
==>label2 et 3 doit etre a zero

"""2eme"""
==>label1 et 3 doit etre a zero
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
8 mars 2006 à 17:58
même si le second caractère #0 il existe donc la longueur de la chaine sera quand même égale à 3 donc le test se faira

jusqu'à la fin et sera remplace par un espace dans label2.caption.

En toute logique par la liaison tu reçois les caractères les un
après les autres s'il ten maque 1 se sera le dernier s'il ten manque 2

ce sera les 2 derniers. Mais un caractère même ayant une valeur nul est considéré par le programme comme un caractère valide.

La signification du cacractère n'est qu'une convention dont le
programme se moque éperdument lui il a reçu un caractère et ce que

l'on en fait après n'est pas son problème.

Si tu reçois une trame 'A#0B' pour le programme elle est valide même si
le caractère #0 n'est pas affichable (c'est pour le visualiser

qu'on le remplace par un espace mais tout autre caractères affichable fairait l'affaire)

il faut juste rajouter

valeur[i]=0;//mets le caractere par défaut que tu veux

pour affecter la valeur au tableau

pour que cela soit plus visible mets plusieurs espace ou des caracteres underscore _ plus visible à l'écran

@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
8 mars 2006 à 18:23
si tu n'es pas convaincu essaies ceci:

sur une form mets 3 TEdit et un bouton

dans le onclick du bouton mets ce code:

procedure TForm1.Button1Click(Sender: TObject);

var buffer:string;

begin

buffer:='A'+#0+'B';

edit1.Text:=buffer[1];

if buffer[2]=#0 then edit2.Text:='caractere nul';

edit3.Text:=buffer[3];

end;

@+

jlen
0
fox37 Messages postés 23 Date d'inscription dimanche 24 août 2003 Statut Membre Dernière intervention 11 février 2007
8 mars 2006 à 22:54
Effectivement je suis convaincus

Ca a l'air d'etre bon pour mes caractères "vide"

Je pousse les esais un peu plus loin pour voir si il n'y a pas de bug.

En vous remerciant tous de votre aide

Existe il une facon d'effacer une zone edit (clear?))?

Fabrice
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
8 mars 2006 à 23:03
une laison ne peux pas envoyer un caractère vide sans créer une erreur de transmission même un caractère nul (#0) à une valeur

d'ailleurs pour info en 'C' c'est le caractère de fin de ligne pour du
texte (chaine à 0 terminal) tous les caractère ont une valeur comprise

entre 0 et 255.

pour vider un Tedit tu fais edit1.text:='';



@+

jlen
0
fox37 Messages postés 23 Date d'inscription dimanche 24 août 2003 Statut Membre Dernière intervention 11 février 2007
10 mars 2006 à 21:22
Tous d'abord merci a tous pour votre aide et vitre disponibilité.
Le prog a l'air de bien marché :o))
Voici le code pour mon gerer mon caractère vide :

var ensemble:string;
Var a, b, c : Byte;
var octet1, octet2, octet3 : char;
var Resultat : integer;

begin
octet1:=str[1];
octet2:=str[2];
octet3:=str[3];

if str[1]=#0 then label15.caption:='0'else

begin
label15.caption:=str[1];
end;
if str[2]=#0 then label16.caption:='0' else
begin
label16.caption:=str[2];
end;
if str[3]=#0 then label17.Caption:='0' else
begin
label17.Caption:=str[3];
end;
a:=ord(octet1);
b:=ord(octet2);
c:=ord(octet3);
Resultat := (c or (b shl 8) or (a shl 16));
Edit2.Text:= Resultat1;

end;


Est il possible en realisant une boucle de pouvoir modifier l'emplacement label.

en clair je prend une variable i
for i:=1 to 3 do
if edit1.text[i]:=#0 then label17.Caption:='0'

Label17 peut il varier avec la variable i ex: i=2 alors on ecrit dans :

label(17+2) donc label19.caption

Merci

Fabrice
0
Rejoignez-nous