Ascii en delphi sur le port serie

Résolu
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007
-
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007
-
Bonjour,
je voudrai savoir si quelqu'un ces comment je pourai envoie mes donner en ascii a une platine relait ?
le code en Quick Basic :

DIM inbuf(800)
OPEN "com1,19200,n,8,1,bin,cs,ds" FOR RANDOM AS #1
PRINT #1, CHR$(3) + CHR$( 1) + CHR$(1) + CHR$(3)
END

je n'arrive pas a refaire le code PRINT #1, CHR$(3) + CHR$( 1) + CHR$(1) + CHR$(3) en delphi 6

merci davance

19 réponses

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
L'equivalent de PRINT #1, CHR$(3) + CHR$( 1) + CHR$(1) + CHR$(3)
est: write(nom_du_fichier, chr(3) + chr(1) + chr(1) + chr(3));
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
Bon alors je vais deja traduire certaine ligne en Delphi, avant de jeter un coup d'oeil à tes documents:

outbuf(0) = 3
outbuf(1) = 1
outbuf(2) = 1
outbuf(3) = outbuf(0) XOR outbuf(1) XOR outbuf(2)
PRINT #1, CHR$(outbuf(0)) + CHR$( outbuf(1)) + CHR$( outbuf(2)) + CHR$( outbuf(3))

var
  outbuf: array[0..3] of byte;
begin
outbuf[0] : = 3;
outbuf[1] := 1;
outbuf[2] := 1;
outbuf[3] := outbuf[0] xor outbuf[1] xor outbuf[2]; // Donne 3 apres calcul

... (chr(outbuf[0]) + chr(outbuf[1]) + chr(outbuf[2]) + chr(outbuf[3]))
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

je te remerci sa maide bien mais jai encors un gro sousi!
si je fait avec le RSCOM.dll:

var send:string;
begin
send := (chr(3) + chr(1) + chr(1) + chr(3));
sendByte(send); // il me dit : TYPE IMCOMPATIBLE 'Integer' et 'String'
//ou
TXD(send); // il me dit: TYPE IMCOMPATIBLE 'Word' et 'String'

alors je suis inpeut perdu! si quelqu'un connai le moin de changer la variable en Word en gardant les carreter ASCII se sera cool merci
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
Au vu de la fonction, tu dois mettre un type integer dedans, je vois pas comment transformer une chaine (non numérique) en integer. Peut-être comme ceci (attention, je risque de dire une bêtise) :

sendByte(3);
sendByte(1);
sendByte(1);
sendByte(3);
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

jai essai sa marche pas!
il faut que jenvoie tt les donner ascii au la platine relait! donc deja je peut oublier pour envoier les donner en plusieur foit!
et si je fait comme tu ma dit il envoie les donner 3 1 1 3 et il les faut en ascii!
mais merci quant meme
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

merci pour le lien je les deja vue, il maide bien pour la création de la connextion mais pour les envoie en ASCII il me dit pas grand chose!
dsl javai plus de reponce sur lautre post, et le sujet et plus le meme, vue ke mtn je cherche a envoie les donner sur le port TXD en ASCII
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
Est-ce que la procedure SENDSTRING fonctionne ?
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

deja essai marche pas!
procedure SENDSTRING (Buffer: PChar);
stdcall; external 'RSCOM.DLL';
il faut les donner en PChar et moi jarrive juste a les mettre en ASCII en metten la variable sur string;
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
As-tu essayé ceci:

SendString(PChar(chr(3) + chr(1) + chr(1) + chr(3)));
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

sa pas lair de marcher!
il y a rien du tous qui se passe, mais il me dit aucune erre alors sé deja bon signe! mtn reste a voire si il envoie bien les donner sur le port TXD avec la commande sendstring
merci
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Sinon, pour envoyer '1' en ascii, il suffit d'écrire SendByte(Ord('1'));
Pareil pour tous les autres caractères.
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

je vien dessai ses tjr pareil il veut pas, il envoie bien la donner en ascii mais pas sur le bon port TXD ,mais la bonne nouvelle ses qu'il me dit aps qu'il y a des erre meme si je mais une variable a lintérieu "SendByte(Ord(chaine)); "
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

voila plus d'info:
jai la platine relait de chez Conrad LeC http://www.conrad.fr/Composants/Automatisme/Automates-programmables/Carte-de-relais-pour-commutation.html
dapre le livre il me disse que je doit transmettre une serie de 4byte

Byte 0            Byte 1                        byte2       Byte3 
Commande -  adresse de la paqute - Donner - total de controle (XOR)
3                    1                                 1            3

le code QuickBasic :

CLS
DIM inbuf(800)
DIM outbuf(3)

OPEN "com1,19200,n,8,1,bin,cs,ds" FOR RANDOM AS #1

outbuf(0) = 3
outbuf(1) = 1
outbuf(2) = 1
outbuf(3) = outbuf(0) XOR outbuf(1) XOR outbuf(2)

PRINT #1, CHR$(outbuf(0)) + CHR$( outbuf(1)) + CHR$( outbuf(2)) + CHR$( outbuf(3))

END

je vous passe aussi le lien où jai mit des foto du texte du livre,ainsi que l'exemple en QuickBasic, tu deverai trouver tous les info et peut etre comprend mieu faut moi lol
http://lefouduroi.fr/portserie/CIMG2330.jpg
http://lefouduroi.fr/portserie/CIMG2331.jpg
http://lefouduroi.fr/portserie/CIMG2332.jpg
http://lefouduroi.fr/portserie/CIMG2333.jpg
http://lefouduroi.fr/portserie/CIMG2334.jpg
merci davacen
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
A la lecture du code BASIC, je me demande un truc: as-tu initialisé la platine ?
Initialise come ceci:

En global:
var
  outbuf: array[0..3] of byte;

// Initialisation
outbuf[0] := 1;
outbuf[1] := 1;
outbuf[2] := 0;
outbuf[3] := outbuf[0] xor outbuf[1] xor outbuf[2]; // Donne 0 apres calcul
SendString(PChar(outbuf[0] + outbuf[1] + outbuf[2] + outbuf[3]));
sleep(2000); // Je crois que la boucle sert à faire patientez le soft, je vois pas son utilité sinon

// Envoi
outbuf[0] := 3;

outbuf[1] := 1;

outbuf[2] := 1;

outbuf[3] := outbuf[0] xor outbuf[1] xor outbuf[2]; // Donne 0 apres calcul
SendString(PChar(outbuf[0] + outbuf[1] + outbuf[2] + outbuf[3]));
sleep(2000); // Je crois que la boucle sert à faire patientez le soft, je vois pas son utilité sinon
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

alors oui en tous 1ere il faut initialise la platine avec la commande 1 1 0 0
ensuite on le fait un delay (sleep) pour pas lui envoier tous de suite tro de donner sinon il risque de saturer , ensuite on envoie donc les info sur le relait à enlanché 3 1 1 3
outbuf(0) = 3 // 3 signifi le type de commande (voire lien http://lefouduroi.fr/portserie/CIMG2331.jpg )
outbuf(1) = 1 // on choisi le numero de la platine de 1 à 255
outbuf(2) = 1 // on choisi le relait à enclancheroutbuf(3) 3  //( a XOR des 3outbuf)

voila inpeut le principe de fonctionnement !
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

apres essai de plusieur facon que tu ma donner, des que je veut envoie les donner le logiciel plante en mettant errer sans plus dinfo!
a mon avie ses la variable SendByte(Pchar.... qui ne passe pas du tous!
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
Tu as essayer de le tracer ? (touche F5, F7, F8) Si tu ne sais pas tracer un programme, aucun probleme, met des ShowMessage('msg') à toutes les lignes et regarde à quelle ligne exactement ton logiciel plante.
C'est SendString et pas SendByte... (erreur de frappes je suppose). De plus SendByte n'est pas une variable mais une procedure.

PS: Est-ce que tu pourrais faire un tout petit effort sur ton orthographe ? Ca serait plus agréable de te relire. Merci.
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

oui dsl pour la faute de frape! cette bien sendstring, alors jai fait un tracer sur le logiciel voila le code du bouton qui envoie les donner:
ShowMessage('msg2');
// Initialisation
outbuf[0] := 1;
outbuf[1] := 1;
outbuf[2] := 0;
outbuf[3] := outbuf[0] xor outbuf[1] xor outbuf[2]; // Donne 0 apres calcul
ShowMessage('msg3');
SendString(PChar(outbuf[0] + outbuf[1] + outbuf[2] + outbuf[3]));
ShowMessage('msg4');

quand je fait le pas à pas il me dit bien le message msg2 et msg3, ensuite il plante en me dissent" le projet.exe a provoqué une classe d'exception EAccessViolation....."
quesque je pourai faire d'autre pour le faire marché?

ps: dsl pour les faute d'orthographe, mais le francais est moi sa jamai coller, je vais éssai de m'apliqué
Messages postés
33
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
30 octobre 2007

j'ai fait quelque essai de mon coté en Visual Basic
jai mit un bouton et le controleur "MSComm"
dans le code du bouton jai mit cesi:

    send$ = Chr(3) + Chr(1) + Chr(1) + Chr(3)
    MSComm1.CommPort = 1
    MSComm1.Settings = "19200,n,8,1"
    MSComm1.PortOpen = True
    MSComm1.OutPut = send$
    MSComm1.PortOpen = False

et sa marche tré bien!
comment je peut faire en delphi le même code ?