Delphi RS232

Résolu
bsama Messages postés 3 Date d'inscription dimanche 17 octobre 2010 Statut Membre Dernière intervention 21 octobre 2010 - 18 oct. 2010 à 21:42
bsama Messages postés 3 Date d'inscription dimanche 17 octobre 2010 Statut Membre 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

4 réponses

AMOzouhir Messages postés 3 Date d'inscription mardi 17 novembre 2009 Statut Membre Dernière intervention 24 octobre 2011
18 oct. 2010 à 22:54
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.
3
bsama Messages postés 3 Date d'inscription dimanche 17 octobre 2010 Statut Membre Dernière intervention 21 octobre 2010
19 oct. 2010 à 21:40
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.
0
Utilisateur anonyme
20 oct. 2010 à 17:57
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
0
bsama Messages postés 3 Date d'inscription dimanche 17 octobre 2010 Statut Membre Dernière intervention 21 octobre 2010
21 oct. 2010 à 00:15
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
0
Rejoignez-nous