Utilisation du composant TComPort

Signaler
-
 Thrifto -
Bonjour à tous !
Je code actuelement sur la plateforme DELPHI avec l'aide du composant TComPort ! J'ai suivi le tutorial de nono : http://nono40.developpez.com/tutoriel/delphi/2005/comport/
tout va pour le mieux dans le meilleur des monde, mais j'aimerais lancé la mécanique plus loin.

J'aimerai récupérer par le biais d'un lecteur de code barre (brancher en COM1) des données et renvoyer cette donnée sur deux autres ports COM2/COM3 sous forme de deux application :
- La première affiche la donnée lu et l'envoie au deux port COM2/COM3
- La deuxième affiche seulement la donnée reçu en COM2/COM3 pour bien vérifier la transmission

L'affichage et la réception de la première étapes est faite (ça marche) mais maintenant je suis bloquer sur l'envoie aux deux COM2, COM3
(Je pars du principe que l'affichage de la donnée sur COM2 et COM3 marche de la même façon que sur mon COM1)
J'aimerai donc un peu d'aide quand à la démarche à suivre pour transmettre sur c'est deux COM, ou si vous avez à votre disposition un tutoriel différent de NONO j’appréciai.
Merci à vous

4 réponses

Avec de l'aide j'ai un peu avancé sur mon projet, j'ai donc ajouté quelques lignes à mon travail pour effectuer les différentes étapes.
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
Var Chaine:String;

begin
  ComPort1.ReadStr(Chaine,Count);
  if AfficheCOM1 then Memo1.Lines.Text := Memo1.Lines.Text + 'COM1, reçu : '+Chaine;
  If eCRLF.Checked
    Then ComPort2.WriteStr(Chaine+#13#10)
    Else ComPort2.WriteStr(Chaine);
  If eCRLF.Checked
    Then ComPort3.WriteStr(Chaine+#13#10)
    Else ComPort3.WriteStr(Chaine);
  if AfficheCOM1 then Memo1.Lines.Text := Memo1.Lines.Text + 'COM2, envoyé : '+Chaine;
  if AfficheCOM1 then Memo1.Lines.Text := Memo1.Lines.Text + 'COM3, envoyé : '+Chaine;
  Comport1.ClearBuffer(true,false);
end;

procedure TForm1.ComPort2RxChar(Sender: TObject; Count: Integer);
Var Chaine:String;
begin
  setlength(chaine,count);
  ComPort2.ReadStr(Chaine,Count);
  Memo1.Lines.Text := Memo1.Lines.Text + 'COM2, reçu : '+Chaine;
end;

procedure TForm1.ComPort3RxChar(Sender: TObject; Count: Integer);
Var Chaine:String;
begin
  setlength(chaine,count);
  ComPort3.ReadStr(Chaine,Count);
  Memo1.Lines.Text := Memo1.Lines.Text + 'COM3, reçu : '+Chaine;
end;

procedure TForm1.btnEnvoyerClick(Sender: TObject);
begin
  If eCRLF.Checked
    Then ComPort1.WriteStr(eEnvoi.Text+#13#10)
    Else ComPort1.WriteStr(eEnvoi.Text);
end;

Cela permet les différents traitements que j'ai à faire.
Mais j'ai un problème plus grave ! Je ne rentre en fait dans aucune des ces procédures RXChar et je ne sais vraiment pas d'où viens le problème.
Je connecte mes ports :
procedure TForm1.Button1Click(Sender: TObject);
begin
    comport1.Connected:= true;
    comport2.Connected:= true;
    comport3.Connected:= true;
end;

J'ai ajouté des
ShowMessage();
dans les procédures RXChar pour savoir si j'y passe et non.
Si vous avez une petite idée d'où viens le problème car je pense que mon code est fonctionnel.
Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
Salut,
question con les événements OnRxChar sont bien associé à chaque ComPort ?
sinon "AfficheCOM1" c'est pas "AfficheCOM2" et "AfficheCOM3" dans le ComPort1RxChar ?
Ensuite "setlength(chaine,count);" sert à rien...
"Comport1.ClearBuffer(true,false);" pour quoi faire ?...
Je pense que tu devrais revoir le lien que tu as donné et le relire et utiliser les exemples, les réponses y sont
@+
Tu as absolument raison ! Je les avais rajouté pour voir l’effet que cela allé impacté sur mon problème et au final le setlength(chaine,count); ne sert à rien car le string me gère très bien la taille de ma donnée. Et pour ce qui est du ClearBuffer (true,false); je pensé que mon buffer était plein et empêchais justement l'affichage dans mon mémo ou Edit.
J'ai oublié de les sortir lors de mon copier coller (qq my bad).

Le problème venais en fait de mon lecteur de code barre qui était configuré en mode clavier au lieu de COM et donc ne permettais en rien le traitement.

Je vais refaire mes test et reviendrais vers vous en cas de problème ! Merci a vous =) !
Voilà je fais le feedback !
Erreurs à évitées (testées et approuvées ...) :
- Regarder sur quels PORTS sont branchés vos appareils et liaison (Pc<>PC)
- Bien vérifier si les ports sont ouverts et connectés
Comport1.Connected := Not Comport1.Connected;

- Si tu utilise une lecteur code barre, regarde s'il est bien configuré !
- Utilisé le débug en pas par pas ça ma bien aidé pour voir où se situé les différents problèmes
- Faire les différents test avec deux PC c'est toujours mieux que de coder en pensant que ça marchera sans les test >.> !

Sinon au final Je reçois la donnée, je l'affiche dans le mémo, je la renvoi sur les deux autres ports COM et je re affiche sur mon mémo que j'ai bien envoyé.
J'ai rajouté une option à l'envoi à partir du edit pour ne pas envoyer si le champs est vide.
procedure TForm1.btnEnvoyerClick(Sender: TObject);
begin
  If eEnvoi.Text =''
    then ShowMessage('Veuillez renseigner le champ texte');
  If eCRLF.Checked and (eEnvoi.Text <>'')
    Then ComPort2.WriteStr(eEnvoi.Text+#13#10)
    Else ComPort2.WriteStr(eEnvoi.Text);
  If eCRLF.Checked and (eEnvoi.Text <>'')
    Then ComPort3.WriteStr(eEnvoi.Text+#13#10)
    Else ComPort3.WriteStr(eEnvoi.Text);
end;


Je pense que ça peut être amélioré mais ça me suffi pour le moment.

Comme l'indiqué ma problématique je compté faire deux applications, une pour le pc qui scan et qui envoi (COM6 => COM4/5) et l'autre pour le pc qui affiche les données réceptionnées(COM4/5=>COM1/2).

Vous avez du remarquer en lisant que j'ai sur un pc où COM4 et 5 relié à COM1 et 2, donc les COM varie en fonction de l'utilisation et des PC.
J'aimerais donc savoir s'il est possible de configurer les comport depuis l'application a partir d'un menu déroulant ou autres, pour évité le problème de portabilité de l'application sur différents PC.
J'ai cru voir une utilisation à partir de cette ligne de code :
comport.port := COM1;


Merci à vous ! J'aime me compliqué la vie (peut être) mais en tout cas pour le moment vous êtes d'une grande aide !