Delphi RS232 [Résolu]

Messages postés
3
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
21 octobre 2010
- 18 oct. 2010 à 21:42 - Dernière réponse :
Messages postés
3
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
21 octobre 2010
- 21 oct. 2010 à 00:15
Salut,
j’utilise le RSCOM.DLL pour construire un espion de com du port série avec delphi7. Pour la testé, j'ai envoyé par exemple un sendstring('ABC1234567890ABC') et à la suite j'ai fait un appelle de readstring(). j'ai réussi à recevoir des data mais c'est structuré. Ma question c'est : comment créer un évènement pour recevoir mes donné, trame par trame, sur une listBox.
merci
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
3
Date d'inscription
mardi 17 novembre 2009
Dernière intervention
24 octobre 2011
18 oct. 2010 à 22:54
3
Merci
Hi
Pour structurer vos données il vous faut un protocole de communication par exemple protocole des compteurs électroniques inspiré de la norme CEI 62056-21.

Si vous voulez ou vous pouvez m'envoyer votre programme en delphi7; j'essayerai de vous trouver une solution a votre problèmes.
a+ et bonne chance.

Merci AMOzouhir 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de AMOzouhir
Messages postés
3
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
21 octobre 2010
19 oct. 2010 à 21:40
0
Merci
salut,

par exemple je veux recevoir cette trame :ABC 10020001 R XYZ<cr> <lf>
ma question c'est comment tester(sans perdre de donné), la fin de trame(<cr> <lf>) et afficher ABC 10020001 R XYZ.
à l'aide de mon programme je reçois : ABC 10020001 R XYZ
suivit d'un caractère 't' (apparemment c'est <cr> <lf>)

voilà mon programme :

unit Unit1;

//Programmé par Yoann
//http://delphipage.free.fr/
//DLL disponible à l'adresse suivante : http://www.b-kainka.de/

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
Label1: TLabel;
Edit2: TEdit;
ListBox1: TListBox;
Button3: TButton;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button3Click(Sender: TObject);
private
{ Déclarations privées }
SortieClgn:Integer;
public
{ Déclarations publiques }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

//Importe les procédures et les fonctions de la DLL que l'on a besoin
function OPENCOM(OpenString:PChar):Integer; stdcall; external 'RSCOM.DLL';
procedure CLOSECOM(); stdcall; external 'RSCOM.DLL';
procedure TXD(d:WORD); stdcall; external 'RSCOM.DLL';
procedure SENDBYTE (Dat: Integer); stdcall; external 'RSCOM.DLL';
function READBYTE(): Integer; stdcall; external 'RSCOM.DLL';
procedure SENDSTRING (Buffer: PChar); stdcall; external 'RSCOM.DLL';
function READSTRING (): PChar; stdcall; external 'RSCOM.DLL';
Procedure CLEARBUFFER (); stdcall; external 'RSCOM.DLL';
function INPUTS():Integer; stdcall; external 'RSCOM.DLL';

procedure TForm1.FormCreate(Sender: TObject);
begin
SortieClgn:=0; //Initialise la variable "SortieClgn"
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenCom('COM1: baud=9600 parity=N data=8 stop=1'); //Ouvre et paramètre la connexion sur COM1
{On peut également faire ceci : "OpenCom('COM1:9600,N,8,0');" mais la notation recommandée par l'auteur (Burkhard Kainka) de la DLL pour toutes les versions de Windows est la première}
Timer1.Enabled:=True; //Active le timer
Label1.Color:=clLIME; Label1.Caption:='COM..OK'; //Timer1Timer(Sender);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False; //Désactive le timer

CloseCOM; //Libère le port
Label1.Color:=clRED;
Label1.Caption:='COM..BAD';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
Var i,a:integer; aa,bb: string;
TAB : array[0..1000]of string; b,d:byte;
begin


bb:=readstring();
if bb<>'' then //on ajoute à liste box que si on reçoit des données

listBox1.AddItem(bb, sender);
Label1.Visible:=True; //Affiche le label
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Timer1.Enabled=true then //Si le Timer n'est pas arrêter alors on se déconnecte avant de quitter le programme
Button2Click(Sender)
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ListBox1.Clear;
end;

end.
Commenter la réponse de bsama
20 oct. 2010 à 17:57
0
Merci
Salut

Essaye ce code et conclue sur ton hypothèse ^^ :

procedure TForm1.Button1Click(Sender: TObject);
begin
  listBox1.Items.Add('ABC 10020001 R XYZ');
  listBox1.Items.Add('ABC 10020001 R XYZ'#13#10);
end;


citation de wikipedia sur la norme RS-232


Pour établir une communication effective via RS-232, il est nécessaire de définir le protocole utilisé : notamment, le débit de la transmission, le codage utilisé, le découpage en trame, etc. La norme RS-232 laisse ces points libres, mais en pratique on utilise souvent des UART qui découpent le flux en trames d'un caractère ainsi constituées :

* 1 bit de départ ;
* 7 à 8 bit de données ;
* 1 bit de parité optionnel ;
* 1 ou plusieurs bit d'arrêt.

Le bit de départ a un niveau logique "0" tandis que le bit d'arrêt est de niveau logique "1". Le bit de donnée de poids faible est envoyé en premier suivi des autres.

La spécification RS-232 prescrit des débits inférieurs à 20 000 bit/s. Cependant, les débits utilisés en pratique entre 75 bit/s et 115 200 bit/s.


La string "ABC 10020001 R XYZ" correspond à 18 caractères soit 18*8=144 bits. Sympa ta frame
Commenter la réponse de Utilisateur anonyme
Messages postés
3
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
21 octobre 2010
21 oct. 2010 à 00:15
0
Merci
salut FRANCKY23012301,

je sais que cr et lf ont les code hexa #13 et #10, qui sont in-affichables.
normalement je dois recevoir : ABC 10020001 R XYZ (le cas quand je me connecte avec hyper terminal ). mais mon interface delphie je reçois :
ABC 10020001 R XYZ
+ ==> c'est un caractère bizarre :?? c'est qu'oit ? et pour quoi je l'ai pas sous hyper terminal ?
et comment tester la fin du trame si ce caractère indique la fin du trame?

je pose beaucoup de question

merci
Commenter la réponse de bsama

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.