Problème de communication série avec mon PC

Bonjour à toutes et à tous,

Je voudrais faire communiquer un Arduino avec mon PC via la liaison série. Pour ce faire, j'ai écrit en Pascal Objet (Lazarus) une petite application : "LitCom" qui lit et écrit sur un port série en indiquant les paramètres qui vont bien.

J'ai écrit un petit sketch Arduino (Pro Mini) pour faire le test :

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(500);
  Serial.println("Initialisation");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()) {
    String data = Serial.readString();
    Serial.println(data);
  }
  Serial.print("Essai de ");Serial.println("Dialogue avec le PC");
  delay(500);
}

Dans un premier temps, je teste mon sketch avec le moniteur série de l'IDE Arduino : ça fonctionne très bien.

Si je débranche mon Arduino du PC et que je le reconnecte, les échanges reprennent sans autre forme de procès. Si j'appuie sur le bouton de reset de mon Arduino, tout repart normalement.

Maintenant, laissant branché mon Arduino sur le PC, je ferme l'IDE Arduino et je lance mon appli : j'établis la connexion et, Oh merveille, mon appli joue le même rôle que le moniteur Série de l'IDE.

Si j'appuie sur le bouton d'initialisation de mon Arduino, la séquence reprend à l'initialisation : parfait.

Maintenant, je déconnecte mon Arduino puis le reconnecte. Là ça ne va plus du tout. Mon appli n'échange plus avec l'Arduino, quoi que je fasse ; réinitialisation de l'Arduino, déconnexion et reconnexion de mon appli, c'est le silence total.

Que je fasse les essais sous Windows 10 ou Ubuntu, le résultat est le même.

Avez-vous une idée de ce qui cloche ?

Cordialement.

Pierre.

L'Arduino réapparaît avec le même nom de périphérique?

Je sais que sous Ubuntu, par exemple, ma carte apparaît comme /dev/ttyUSB0.
Si je la débranche et que je la rebranche rapidement, elle change de nom et devient /dev/ttyUSB1.
Par contre, si je la débranche et que j'attends une dizaine de secondes avant de la rebrancher, elle revient avec le nom /dev/ttyUSB0.

Je ne sais où est ton problème, mais je peux faire une remarque sur ton sketch, si tu lis le port série ainsi:
String data = Serial.readString();
C'est à dire sans caractère de fin comme (\n ou \r ou les deux) il faut initialiser le timout du port série:

	Serial.begin(9600);
	Serial.setTimeout(50);

Si non, tu vas attendre 1 seconde avant de disposer des données.

Autre solution, sans timout:
data = Serial.readStringUntil('\n'); // Attente de nouvelle ligne
Pour autant que ton application termine son envoi par un caractère nouvelle ligne (\n)

Cordialement
jpbbricole

Ton programme en pascal a t'il toujours un objet/flux valide ?
Que fais tu dans ton programme pascal, pour lire/écrire dans le flux du port série ?

@fdufnews : Je n'ai pas ce problème pour l'instant.

@jpbbricole : oui, j'ai vu, mais bon, le sketch n'est pas élaboré.

@terwal : Qu'entends-tu par avoir un objet/flux valide ?
Voilà la procédure de communication pour la lecture :

procedure TForm1.ConnecterClick(Sender: TObject);
begin
  if Assigned(PortCOM) then
    PortCOM.Free;
  Stop:= False;
  PortCOM:= TBlockSerial.Create;
  PortCOM.OnStatus:= @OnDistoXStatus;
  NbBauds:= StrToInt(ChoixBauds.Items[ChoixBauds.ItemIndex]);
  try
    PortCOM.Connect(NomPort.Items[NomPort.ItemIndex]);
    PortCOM.Config(NbBauds, 8, 'N', 1, False, False);
    while not Stop do
    begin
      try
        InfoCOM:= PortCOM.RecvString(2000);
        if InfoCOM <> '' then
          MemoData.Lines.Add(InfoCOM);
        Application.ProcessMessages;
      except
      end;
    end;
  finally
    DeconnecterClick(Sender);
  end;
end;

Cordialement.

Pierre.

Bonjour,

Quand tu déconnectes ton arduino, ton port com disparaît au niveau du pc.
Si tu veux l'utiliser de nouveau à la reconnexion, il faut rouvrir le port com.

On est d'accord. Sous Windows, dans le gestionnaire de périphériques, lorsque je débranche mon Arduino, le port correspondant disparaît ... puis réapparaît lorsque que le rebranche.

Apparemment, le moniteur de l'IDE Arduino sait voir automatiquement cet évènement (puisqu’il se remet à échanger avec mon Arduino) alors que mon appli ne le sait pas. C'est ce que je demande à résoudre.

Cordialement.

Pierre.

Tu fais un "PortCom.connect", ce qui ouvre un flux sur le port série et permet de faire RecvString.
Lorsque tu relance ton Arduino, ce flux est coupé, ou la connexion est coupé si tu préféres.
Refait tu du coup automatiquement le Connect, lorsque l'Arduino remonte le port série ?

Dans mon post #5, je décris la procédure de connexion/lecture écrite en pascal objet. Même si on ne connaît pas ce langage, les instructions me paraissent assez claires pour être comprises.

Qu'est-ce que je fais avec ça ? Après avoir connecté mon Arduino au PC, j'active cette procédure : ça ouvre le port et vient lire de manière cyclique ce qui transite sur ce port.

Si, avant de faire ça, l'Arduino était connecté et que le moniteur de l'IDE Arduino était fonctionnel, je voyais, dans le moniteur, les textes envoyés par les Serial.println().

Si, dans ces conditions, sans débrancher l'Arduino, je ferme le moniteur série puis j'établis la connexion avec mon appli, je vois dans mon appli les textes envoyés par les Serial.println().

Maintenant, si je débranche/rebranche l'Arduino et que je m'y connecte avec mon appli, je ne vois plus les textes envoyés.

NOTA : j'ai modifié mon sketch pour qu'il n'y ait qu'un seul échange et qui allume la LED si l'Arduino reçoit un message :

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  delay(500);
  Serial.println("Initialisation");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()) {
    String data = Serial.readString();
    digitalWrite(13, HIGH);
    Serial.println(data);
    delay(500);
    digitalWrite(13, LOW);
 }
//  Serial.print("Essai de ");Serial.println("Dialogue avec le PC");
//  delay(500);
}

Par ailleurs, dans mon appli, je peux suivre ce qui se passe grâce à une messagerie de statut. Et bien dans les deux cas, les messages sont les mêmes ! J'ai l'impression que mon appli reçoit toujours les messages, mais qu'un processus interne les bloque.

Statut: 1 \\.\COM14 est ouvert // juste avant l'Arduino a été connecté au moniteur de l'IDE
Statut: 2 HR_CanRead 
Statut: 4 HR_ReadCount 6
Statut: 4 HR_ReadCount 7
Statut: 4 HR_ReadCount 3
Statut: 5 HR_WriteCount 7 // j'envoie le message "Bonjour" : (7 caractères) --> la LED de l'Arduino s'allume
Statut: 2 HR_CanRead 
Statut: 4 HR_ReadCount 5
Statut: 4 HR_ReadCount 4
Statut: 0 \\.\COM14 est fermé // je déconnecte puis reconnecte l'Arduino
Statut: 1 \\.\COM14 est ouvert
Statut: 2 HR_CanRead 
Statut: 4 HR_ReadCount 20
Statut: 4 HR_ReadCount 22
Statut: 4 HR_ReadCount 11
Statut: 5 HR_WriteCount 7 // j'envoie le message "Bonjour" :  (7 caractères) --> la LED de l'Arduino s'allume
Statut: 2 HR_CanRead 
Statut: 4 HR_ReadCount 7
Statut: 0 \\.\COM14 est fermé

Dans un cas comme dans l'autre, le message est transmis vers l'Arduino.

J'essai simultanément de voir sur le forum Lazarus si j'ai une explication.

Cordialement.

Pierre.

Je ne comprends pas le sens de ta remarque ?
Je réponds à ta question, aurais je dis quelque chose de vexant ?

Si tu rétabli la connexion systématiquement, je n'ai malheureusement pas d'idée.

@ terwal : Ma remarque consistait simplement à décrire ce que je faisais en langage Pascal. C'est ma manière de la présenter qui a peut-être été vexante.

En tous cas, rien de ce que tu as dit ne l'a été.

Finalement, le problème est résolu : faux problème.

J'ai refais mes manips avec un autre Arduino (un Nano) et tout à bien fonctionné.

J'ai repris mes manips avec le Pro Mini, mais avec un autre type d'interface USB <--> Port série et tout a bien fonctionné.

Le circuit d’interface avec lequel ça ne fonctionne pas est équipé d'un CI CP2102. Celui avec lequel ça fonctionne est équipé d'un CI CH340G.

J'ai un deuxième circuit d'interface équipé d'un CI CP2102 --> même problème.

Étonnant car ces circuits fonctionnent bien avec l'IDE Arduino. La gestion des signaux en interne doit être différente ?

Cordialement.

Pierre.