Go Down

Topic: Comment attacher le port USB après une mise en veille (Read 400 times) previous topic - next topic

pierrot10

Bonjour à tous,

J'affiche des messages sur mon terminal dans le but de debugger mon programme. Donc mon cable USB est connecter à mon microcontrolleur (SAMD21) à mon PC.

Puis je lui ce que fais mon microcontrolleur. Une fois qu'il  terminé  il se met en mode sleep et j'entends un bip de mon ordiaeur, comme si je retirais le cable USB.

Quand il sort de sa veille, il reprend des mesures mais plus rien ne s'affiche sur mon terminal.

Donc je dois faire un truc du genre
Code: [Select]

if(wasUSBConnected==true){
                USBDevice.init();
                USBDevice.attach();
                Si.sprintln(F("Reattaching USB"),2);
              }else{
                Si.sprintln(F("USB: no need to reattach it"),2);
              }

mais voilà, ca ne marche pas...
Il faut aussi, que losque mon cable n'est pas branché, qu'il ne le démonte pas, vu qu'il y en a pas.

En gros voici comme je le fais

Code: [Select]


// Check if USB is connected to the microcontroller
wasUSBConnected = false;
if(Serial){
  Si.sprintln(F("Detaching USB"),2);
  wasUSBConnected = true;
  USBDevice.detach();
}else{
  Si.sprintln(F("USB: no need to detach USB"),2);
}

// Put in sleep mode
for (int i=0; i<int(TX_INTERVAL/10); i++) { // TX_INTERVAL = 60s
  // Use library from https://github.com/rocketscream/Low-Power
  rtczero_sleep(); // Sleep for 10s
}
             
// Check if it was attached
if(wasUSBConnected==true){
  Si.sprintln(F("Reattaching USB"),2);
  USBDevice.init();
  USBDevice.attach();
}else{
  Si.sprintln(F("USB: no need to reattach it"),2); // Because we do not use the Terminal or nothing is connected to the USB port
}

Premièrement, est-ce que je controlle correctement si le port USB est utilisé
Deuxièmement, est-ce que j'attahce et détache correctement le port USB?

Merci pour vos lumières
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

68tjs

Il faut toujours arracher les renseignements : C'est quoi ton terminal ?
Si c'est celui de l'IDE ce n'est peut-être pas un bon choix.
Il existe des tas de programme terminaux pour les différents systèmes d'exploitations, regarde de ce coté et fait des tests.

Remarque : le samd21 est un ARM et à ce titre devrait  posséder plusieurs canaux UART.

hbachetti

Salut

La première chose à faire est de vérifier que le port USB réapparaît bien sur le PC lorsque le processeur se réveille.
Si c'est bien le cas, le problème se situe peut-être au niveau du terminal.
Tu es sous Windows ou Linux ?

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

pierrot10

Hello,
Merci pour vos réponses.

Alors j'utilise l'IDE 1.8.5 d'Arduino et Windows 10.

Quand le module a pris les mesures, il se met en veille.Je viens de voir dans Tools->Port. Le port ne disparait pas (COM5 (Adafruit Feather MO)). Mais quand le module se réveille, plus rien ne s'affiche dans mon terminal, mais le code continue à trouner et les mesures sont envoyées...

Si il y a un terminal meilleur, je suis curieux de l'essayer...
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

68tjs

Quote
Si il y a un terminal meilleur, je suis curieux de l'essayer...
Pour cela il faudrait que tu répondes aux questions qu'on te pose :
Tu es sous Windows ou Linux ?

pierrot10

Ben j'ai répondu  :)
Quote
Alors j'utilise l'IDE 1.8.5 d'Arduino et Windows 10.
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

68tjs

Sous Windows j'ai l'impression que "minicom" est assez utilisé.
Sous Linux j'utilise Cutecom.

pierrot10

Bonjour,
Après une recherche, il semble que minicom est un outil pour unix (sauf erreur)

Vous pensez que c'est un problème de terminal?

Si je controlais que le cable est connecté ou pas, et que si oui, le microcontrolleur, le démontais, puis le remonte après le mode sleep, ca ne contournerait cette issue?

Je dois vraiment pouvoir continuer à suivre l'activité de mon micocontrolleur après le mode sleep

Bon dimanche!!
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

hbachetti

Quote
Après une recherche, il semble que minicom est un outil pour unix (sauf erreur)
Oui tout à fait. Mon préféré sous Linux.
Mais beaucoup de logiciels se portent sous Windows.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

pierrot10

Bonjour,
Je suis toujours bloqué avec ce problème.
Ce que j'aimerais bien savoir, c'est comment je peux tester si mon cable est connecté ou pas

Par exemple,
Code: [Select]

Serial.begin()
While(!Serial){}

Il va tourner en boucle si je n'ai pas connecté mon cable.

Donc si je fais ceci
Code: [Select]

if(Serial){}

Il devrait me retoruner True s'il est connecté, ou False, s'il ne l'est pas.

Simplement, s'il n'y a aucun paquet qui est envoyé sur le Serial, il pourrait toujours retourner False.

Donc que me recommanderiez-vous de faire pour controller ceci?

Code: [Select]
Serial.print("test");
while(Serial){
  // test a été repéré
  // Je détache le port USB
}
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

pierrot10

#11
Oct 17, 2018, 10:24 pm Last Edit: Oct 17, 2018, 11:20 pm by pierrot10
Hello hbachetti,


Je pense que j'ai résolu mon problème et je ne comprends pas pourquoi ca ne marchais pas au début. Pourtant mon code est similaire. J'ai aussi découvert, qu'il fallait réouvrir le terminal, quand le port USB est réattaché. C'est probablement pour cela, que je croyais que ca ne marchait pas  >:(

j'ai rajouté du code pour affiché le résultat sur un LCD OLED

Code: [Select]
 
// Check to detach USB when connected
wasUSBConnected = false;
if(Serial){
   Si.sprintln(F("Detaching USB"),2);
   wasUSBConnected = true;
   //Serial.end();
   USBDevice.detach();
                
   display.clearDisplay();
   display.setCursor(0,0);
                display.print("Detaching USB");
                display.display();
    
              }else{
                Si.sprintln(F("USB: no need to detach it"),2);
                display.clearDisplay();
                display.setCursor(0,0);
                display.print("USB not connected");
                display.display();
              }
              
// Put into sleep
              for (int i=0; i<int(TX_INTERVAL/10); i++) { // Make sure that 10 match to the sleeping time
                // Use library from https://github.com/rocketscream/Low-Power
                rtczero_sleep();
              }
 // Now it wakeup
              // Check how to reattach USB
              if(wasUSBConnected==true){
            
                USBDevice.init();
                USBDevice.attach();
                //Serial.begin(9600);
                delay(2000); // give time to reopen the terminal
                Si.sprintln(F("Reattaching USB"),2);
                display.clearDisplay();
                display.setCursor(0,50);
                display.print("Reattaching USB");
                display.display();
              }else{
                Si.sprintln(F("USB: no need to reattach it"),2);
              }

Mais soulève une nouvelle question. Si je commente ceci
Code: [Select]
// Serial.end();
 //Serial.begin(9600);

ça fonctionne, pourtant j'ai lu qu'il fallait terminer Serial (Serial.end)
Code: [Select]
Serial.end();
Commenté ou pas ca fonctionne, mais si Serial.begin(9600) est commenté
Code: [Select]
//Serial.begin(9600);

Je suis un peu surpris car si Serial est terimé (ou désactivé) il faudrait réactivé le Serial, non?
https://www.arduino.cc/en/Serial/End

J'ai donc aussi essayé en décommentnat
Code: [Select]
Serial.begin(9600);
et ca marche

Donc je me demande pourquoi ca marche dans toutes les situation?

Je laisserai donc les deux décommenté
Code: [Select]

Serial.end();
Serial.begin(9600);


Mais j'aimerais bien comprendre et surout savoir si je fais bien.

(Ca serait bien que je n'aie pas à réouvrir mon terminal avec un sleep, mais c'est gérable... :)  )
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

Go Up