Sur Arduino Due comment utiliser Programming Port et Native USB Port.

Bonjour,
Ceci peut être la suite d'un ancien post
https://forum.arduino.cc/index.php?topic=508415.0

J'essaie d'adapter sur une Arduino Due un code prévu pour une Arduino Micro.
pour lire le port COM, il utilise les fonction SerialUSB
Ce code issu d'un autre forum, lit des trames consignes de postion provenant d'un logiciel SimTools 2
Ce logiciel envoie sur une port COM ( à définir) une trame de consigne 10bits.
Le code téléversé doit lire cette trame de consigne pour commander les sorties de l'Arduino Due en fonction des positions feedback lues par l'ADC

Le code de l'Arduino doit pouvoir lire calculer une correction de position et adapter ces signaux en sortie en fonction de cette trame 10 bits lues par un port COM et on l'on doit pouvoir consulter des données comme la version du code injecter, les valeurs Feedback et certaines variables configurée dans le code par le même port COM lorsque le logiciel SimTools est mis en pose (plus d'envoie de trame de consigne)

En reprenant la discussion de l'ancien post Probleme communication serialUSB en Port Natif Arduino DUE - Français - Arduino Forum

1) J'aimerais savoir si dans mon cas, je suis dans le cas d'utilisation en même temps, d'une "session" Arduino IDE Programming Port ET d'une "session" IDE Arduino Native USB Port.

ou d'un logiciel ( SimTools) qui fonctionne depuis le PC en utilisant le Programming Port, il doit aussi fonctionner avec le Native USB port sans modification autre que le choix du COM port ?

2) A part le problème de lecture aléatoire selon les sessions de la trame de consigne, j'ai le Native USB Port qui n'a jamais le même numéro de port ! C'est fortement pénalisant car le logiciel SimTools daoit démarrer en automatique avec la reconnaissance du port natif actif.
Comment fixer le numéro Native USB port ?
Par contre le Programming Port est toujours le COM3 !

3) Jusqu'à présent le code fonctionne le mieux avec le téléversement par le Programming Port COM3 et la lecture de la trame de SimTools par le Native USB port à 115200 bauds
Lecture - Interprétation ne s'effectuent pas à chaque fois, je n'arrive pas à déterminer pourquoi le code vivote parfois et parfois j'ai aucun trafic sur le Native USB port ( regardé avec Serial Port Monitor)

En débit de void setup () , j'ai SerialUSB.begin(115200); puis while(!SerialUSB);

4) A quelle vitesse stable et fiable puis-je configurer SerialUSB ? 250000 ?

Merci de toute votre aide !

Bonjour, il me vient des questions sur la Due afin d'établir les bases pour comprendre ...

A) Quand la Due a ces 2 ports USB de branchés sur le PC ( 2 COM Actifs )

SerialUSB ..... concerne bien que le Native USB Port. ?

Serial ..... concerne bien que le Programming Port ?

B) Quand la Due a juste le Programming Port branché sur le PC ( COM3 Actif )

Uniquement Serial ... agit le le Programming Port ?

SerialUSB .....
ou
Serial.... agissent tout les 2 ?
Je pose cette question car dans le code de je cherche à adapter et initialement prévu pour une Micro qui a que un port USB, les seuls ordres de lecture étaient des SerialUSB .....
et
SerialUSB ..... semble agir sur le IDE Sérial Monitor configuré sur Programming Port et en choisissant le COM changeant attribué au Native USB Port.

Pourquoi cela fonctionne ? (peut-être sur 3 pattes !)
Pourquoi SerialUSB ..... ne fait transiter aucune donnée sur le port série COM3 ? ( vérification faite avec Serial Port Monitor Démo)

C) Quand la Due a juste le Native USB Port branché sur le PC ( COM variable selon les sessions Windows et l’emplacement de port PC utilisé )

Que SerialUSB ..... est utilisable ?
Avez vous le moyen d'imposer un numéro de port fixe pour le Native USB Port ?
--> Actions Windows 8.1 ou dans le code Ino dans le void setup() ?

D) Téléversement par Programming Port ou Native USB Port ?

En utilisant l'extrait de code ci-dessous de @ ard_newbie, il me permet de téléverser sur un port ou sur l'autre.
Pouvez-vous m'indiquer quand appliquer le téléversement par Programming Port ou par Native USB Port ? Avantages / Inconvénients ?

void setup() {
  Serial.begin(115200);
  SerialUSB.begin(115200);
   
}
void loop() {
  if(Serial.available()){byte c=Serial.read();SerialUSB.write(c);}
  if(SerialUSB.available()){byte c=SerialUSB.read();Serial.write(c);}
}

Merci d'avance de votre aide à un novice !

Par contre le Programming Port est toujours le COM3 !

L'ATmega16u2 a probablement un numéro de série, ce qui permet à Windows de lui attribuer toujours le même device.

A) Quand la Due a ces 2 ports USB de branchés sur le PC ( 2 COM Actifs )
SerialUSB ..... concerne bien que le Native USB Port. ?
Serial ..... concerne bien que le Programming Port ?

Oui.

B) Quand la Due a juste le Programming Port branché sur le PC ( COM3 Actif )
Uniquement Serial ... agit le le Programming Port ?
SerialUSB .....
ou
Serial.... agissent tout les 2 ?

Je ne sais pas si le port serialUSB sera actif en étant débranché, mais je ne pense pas que son utilisation soit prohibée, écrire sur ce port n'aura pas d'effet, c'est tout.

SerialUSB ..... semble agir sur le IDE Sérial Monitor configuré sur Programming Port et en choisissant le COM changeant attribué au Native USB Port.

Serial Monitor utilisera le port sélectionné dans Outils/port. Le chargement aussi.
Dans le code, si tu veux afficher des infos il faudra ouvrir SerialUSB.
Tu peux aussi utiliser Serial, les infos sortiront sur cette ligne.

Pourquoi SerialUSB ..... ne fait transiter aucune donnée sur le port série COM3 ? ( vérification faite avec Serial Port Monitor Démo)

Si COM3 représente le Programming Port je ne vois pas pourquoi SerialUSB écrirait des données sur COM3.

C) Quand la Due a juste le Native USB Port branché sur le PC ( COM variable selon les sessions Windows et l'emplacement de port PC utilisé )
Que SerialUSB ..... est utilisable ?
Avez vous le moyen d'imposer un numéro de port fixe pour le Native USB Port ?
--> Actions Windows 8.1 ou dans le code Ino dans le void setup() ?

SerialUSB est utilisable en toutes circonstances.
Fixer le N° de port est à la charge de Windows.
Sous Linux je le vois toujours en /dev/ttyACM0

En utilisant l'extrait de code ci-dessous de @ ard_newbie, il me permet de téléverser sur un port ou sur l'autre.
Pouvez-vous m'indiquer quand appliquer le téléversement par Programming Port ou par Native USB Port ? Avantages / Inconvénients ?

Ce n'est pas parce que Serial et SerialUSB sont initialisés dans le Setup() que tu peux téléverser ou pas sur l'un ou sur l'autre.
Le téléversement utilise le port spécifié dans Tootls/Port et le Serial Monitor aussi.

Pour résumer si tu utilises le port natif pour programmer la DUE, les informations écrites sur SerialUSB seront affichées sur le Serial Monitor (debug par exemple).

Si tu utilises le Programming Port pour communiquer avec un autre logiciel sur le PC, les informations devront être lues sur Serial. Si des réponses sont attendues pas le logiciel PC, elles devront également être écrites sur Serial.

La seule différence importante entre les deux est que le port natif peut être configuré pour émuler un device USB (clavier, souris).

Merci @ hbachetti de tes réponses

Entre temps j'ai encore fait des essais en utilisant

void setup() {
  Serial.begin(115200);
  SerialUSB.begin(115200);
   
}
void loop() {
  if(Serial.available()){byte c=Serial.read();SerialUSB.write(c);}
  if(SerialUSB.available()){byte c=SerialUSB.read();Serial.write(c);}
}

Avec le code ci-dessus j'ai pu téléverser en configurant l'IDE Arduino:
(1) Carte Arduino Due (Programming Port) + Port Arduino Due (Programming Port)
(2) Carte Arduino Due (Native USB Port) + Port Arduino Due (c)

En configurant l'IDE selon le choix (2), j'ai pu téléverser mon code ino sans erreur !

Chose bizarre: Ce sont les led RX du Configuration : qui se sont allumées !...
Jamais je n'ai vu une led RX ou TX du Native USB Port qui a clignotée !!!

Cela signifie que le téléversement selon (1) ou (2) aboutit au même résultat ?

As-tu un code commenté en Français qui gère réellement le Native USB Port en allumant ces leds
Exemple a) Lecture de données sur un logiciel par le Native USB Port
Exemple b Lecture d'une saisie issues d'un clavier azerty PC en USB

Quelle est la vitesse maximum fiable sur le Native USB Port ? 250000 ?

Autre chose bizarre depuis le téléversement selon (2) , a condition d'utiliser toujours le même port USB physique du PC, le port COM4 est toujours pour l'instant reconnu en port COM4 (Je sers les pouces pour que cela ne bouge plus à l'avenir !!!....)

Autre essai que j'utilise à présent:

SerialUSB.begin(115200);
while(!SerialUSB);
  1. Téléversement avec la configuration IDE (1) + COM4 Native USB Port débranché
  2. Configuration IDE avec Carte Arduino Due (Programming Port) + Port Arduino Due (Native USB Port)
  3. Dès la fin du téléversement, branchement de COM4 Native USB Port
    4a) La Due lit la trame consigne sur le port COM3 (Programming Port)
    et en simultané
    4)b) interrogation par le COM4 Native USB Port de requête programmée dans le code téléversé
    La syntaxe des requêtes est similaire (ex : XC00C) aux consignes de positions émises par le logiciel SimTools sur le port (Programming Port)

Je ne comprends pas pourquoi avec l'IDE configurée ainsi, j'obtiens des interrogations via le Native USB Port COM4 !
Pouvez-vous me vulgariser ce qui ce passe ! et ce que je ne comprends pas

Un peu de hors sujet rapide:....
Exemple si un croquis sur PC se nomme "Beta1"
A l'ouverture du croquis "Beta1" ,y-a-il un moyen de mettre le nom de croquis ouvert comme variable String "Beta1" (sans saisie manuelle de "Beta1"

Merci de votre aide !

En configurant l'IDE selon le choix (2), j'ai pu téléverser mon code ino sans erreur !

J'ai l'impression que tu ne comprends pas que même sans ouvrir les ports série côté ARDUINO (Serial.begin()
et SerialUSB.begin()) le code se téléverse quand même.
Tu peux faire la même chose avec un sketch exemple Blink.

Quelle est la vitesse maximum fiable sur le Native USB Port ? 250000 ?

250000 me paraît faible. A essayer, je ne connais pas le maximum.

As-tu un code commenté en Français qui gère réellement le Native USB Port en allumant ces leds
Exemple a) Lecture de données sur un logiciel par le Native USB Port
Exemple b Lecture d'une saisie issues d'un clavier azerty PC en USB

Je ne pense pas qu'il y ait des LEDs sur le natif.
La lecture de données est classique : voir SerialUSB.read().
L'USB natif n'est pas un port HOST, donc pas de clavier possible.

Je ne comprends pas pourquoi avec l'IDE configurée ainsi, j'obtiens des interrogations via le Native USB Port COM4 !
Pouvez-vous me vulgariser ce qui ce passe ! et ce que je ne comprends pas

Je n'ai rien compris à tes manips.

A l'ouverture du croquis "Beta1" ,y-a-il un moyen de mettre le nom de croquis ouvert comme variable String "Beta1" (sans saisie manuelle de "Beta1"

Utilise FILE mais le nom du répertoire sera inclus.

Merci de votre aide

Utilise __FILE__ mais le nom du répertoire sera inclus.

Modification intégrée à mon adaptation de code.
Cela me convient trés bien ! :grin:

Je ne pense pas qu'il y ait des LEDs sur le natif.

Si entre les 2 ports USB verticalement il y 4 leds: ON / L / TX et RX

Les leds RX / TX du Programming Port étant son port et le connecteur d'alimentation externe

As-tu un code commenté en Français qui gère réellement le Native USB Port en allumant ces leds
Exemple a)  Lecture de données sur un logiciel par le Native USB Port
Exemple b   Lecture d'une saisie issues d'un clavier azerty PC en USB

As-tu des liens à ce propos ?

Je n'ai rien compris à tes manips

.
J'ai décrit étape par étape les manipulations que je fais pour l'utilisation du moniteur série du Native USB Port tout en ayant l'IDE configurée sur Carte Arduino Due (Programming Port)

TMP RX TX Due.jpg

As-tu des liens à ce propos ?

Pas précisément.

J'ai décrit étape par étape les manipulations que je fais pour l'utilisation du moniteur série du Native USB Port tout en ayant l'IDE configurée sur Carte Arduino Due (Programming Port)

Encore une fois le téléversement et la communication sur les ports sont complètement indépendants.

hbachetti:
SerialUSB est utilisable en toutes circonstances.

Si SerialUSB... est utilisable pour les 2 ports de l'Arduino Due

Comment dans le imposer dans cette ligne

buffer = SerialUSB.read();

de lire sur le Programming Port ?

Si je suis obliger d'utiliser

buffer = Serial.read();

pour être certain de lire sur le Programming Port, j'aurais dans la même fonction des

Serial.available
Serial.read
et
SerialUSB.available
SerialUSB.print

Comment je dois configurer le Setup ? ainsi ?
SerialUSB.begin(115200);
while(!SerialUSB);
Serial.begin(115200);
while(!Serial);

En configurant le Setup comme ci-dessus et en utilisant les Serial et les SerialUSB

;D :grin: Je lis apparemment correctement la trame de consigne SimTools et j'ai également de Output digitales et PWM :sunglasses: :grin:

MAIS car il y a un MAIS !.. >:( .

SerialUSB.available et SerialUSB.print ne fonctionne plus sur le moniteur série du port Natif

Le moniteur série s'ouvre (pas d'indication port COM 4 busy)
Après la saisie et envoie des requêtes prévue dans le code ino, aucun retour arrive dans la fenêtre sous la ligne de saisie.
Avant d'utiliser Serial et SerialUSB mélangé dans le code, je n'avais pas de Ouput sur la carte mais les requêtes fonctionnaient !

Il y a t-il une ligne de code pour pouvoir passer de Serial à SerialUSB et vice versa :-*

Un retraité novice qui te remercie d'avance pour tes informations de configuration

SerialUSB.read

Si SerialUSB... est utilisable pour les 2 ports de l'Arduino Due

SerialUSB est utilisable pour le port natif, point final.

Pour le reste ça devient imbitable. Une bonne nuit de sommeil ?

Merci ;D

Bonjour

Mon problème avec le moniteur série fonctionne, c'était dû à une mauvaise manipulation de ma part. Quand je me préparais à ouvrir le moniteur série , je consultait le port et s'il était déjà coché, j'ouvrais le moniteur série.
Il fallait juste cliquer sur le port série concerné même s'il était déjà coché!

Je bute actuellement sur un problème d'erreur Sérial, certes peu nombreux, ils ne perturbent pas le fonctionnement "normal" entre SimTools et l'Arduino due équipé d'un CPU SAM3X8E ( Dans le fonctionnement "normal", Simtools envoie en permanence par la voie série des consignes de positions. Dans ce fonctionnement la petite erreur de lecture série passe inaperçue car la trame incorrecte est rejetée et remplacée par la suivante.

Quand l'arrêt ou le démarrage de Simtools est commandé, Simtools émet une trame unique : respectivement XE00C ou XS00C
Ces trames uniques XE00C ou XS00C sont utilisé par des branches du code commandant des actions lors de l'arrêt ou lors du démarrage de Simtools.
Lorsque parfois une de ces trames unique est rejetée, le code Arduino ne peut plus remplir sa fonction lors de l'arrêt ou lors du démarrage de Simtools.

Je viens à ma demande à propos de l'Arduino Due
Y-a-il un document SAM3X8E déclarant pour Serial et Serial USB pour chaque vitesses de transmission possible , le taux d'erreurs associé ?
J'ai cherché sans succès dans le datasheet Atmel 11057C-32-bit-Mars2015 et par Google

Pouvez vous me diriger vers un tel document ! (j'étais tombé sur un tel document sur les CPU AVR lors de mes recherches Google)

Merci pour toutes vos informations à ce sujet.

hello
datasheet du sam, page 778

le lien pour la data sheet du sam

dfgh:
hello
datasheet du sam, page 778

Bonsoir,
Merci pour votre réponse !
Le datasheet est le même que celui que j'avais
J'étais passé à côté de la page 778: mauvais mot clé dans mes recherches!
Le tableau d'exemple du datasheet indique l'erreur pour différentes liaison série de 38400 bauds
Je ne comprends pas vraiement à 1ère vu ce soir l'usage du tableau
1 ) CD correspond à quoi ?
2) Over correspond à quoi ?
3) FP correspond à quoi ?
4 ) Comment configurer la liaison Serial dans Setup () pour être dans les 5 cas avec 0,00% d'erreur
J'ai mis dans setup() que Serial.begin(38400); sans préciser autre chose : Je vois que je suis complètement à côté de la plaque !
5) Quel est le critère de choix entre les 5 lignes de configuration Serial ?
6) Comment "extrapoler" le tableau page 778 vers un baud rate plus elevé commme 115200 et 250000 bauds ?
7) 35.7.5.2 IrDA Baud Rate de la page 799 concerne encore Serial ?

Dans le code que j'adapte, j'ai essayé Serial à 2 vitesses différentes 115200 bauds puis 250000 bauds.
J'ai les mêmes problèmes à ces 2 vitesses
a) Erreur de transmission trés aléatoire et faible mais présentes ... (objet de ma demande intiale)
b1) A 250000 bauds ,obligation de mettre delayMicroseconds(25); à la fin de la fonction de lecture de la trame afin que la boucle Loop () fonctionne
b2) A 115200 bauds , je dois passer mettre delayMicroseconds(250);à la fin de la fonction de lecture de la trame afin que la boucle Loop () fonctionne

Dans un 1er temps, je pensais résoudre le problème a) en espérant que b1) ou b2) soit lié au a)

Merci à toute votre aide de vous pouvez apporter à un novice !

Dans Setup, je déclare

Serial.begin(250000);                     // Ouvre le port série Programming Port et fixe son débit à 115200 bauds.
  while (!Serial);                         // Attend que la connexion soit établie sur le Programming Port

Fonction de lecture de la trame avec à la fin le delayMicroseconds(25);

void SerialWorker()
{
  int buffer = 0;
  int buffercount = -1;                           // En attente de la reception d'un octet -> Etat initial de la variable buffercount=-1  

  while(Serial.available())                     // Boucle sans fin, et indéfinie tant que des données entrantes sont présentes sur le port série                                                                 // Etait while(Serial.available()) 
  {                                     
    if(buffercount==-1)                           // Aucun 1er octet conforme <=> X a été retenu pour l'instant
    {
      buffer = Serial.read();                     // Lecture de l'octet sur le port série
      if(buffer != 'X')
      {
        buffercount=-1;                           // Rejet de l'octet reçu si le premier octet n'est pas un X
      }
      else
      {
      buffercount=0;                              //  commandbuffer[0] = Octet conforme <=> X est concervé
                //emplacement delay fct mal car long à réagir
      }
    }
    else                                          // Après la réception de l'octet <=> X , les 3 octets suivant seront lus
    {
      buffer = Serial.read();
      commandbuffer[buffercount]=buffer;           // commandbuffer[1] commandbuffer[2] commandbuffer[3]  commandbuffer[4]
      buffercount++;
      if(buffercount > 3)                         // Une trame de 5 octets a été lue, commandbuffer[0] à  commandbuffer[4]
      {
        if(commandbuffer[3]=='C')                 // Si le 4ème octet lu est un C, la trame complète reçue est validée conforme et utilisable ParseCommand()
        {
               //emplacement delay ne fct pas
          ParseCommand();                         // Interprétation de la trame reçue une fois cette trame validée complète et conforme, 
               //emplacement delay ne fct pas
        }
              //emplacement delay ne fct pas
        buffercount=-1;                           // Remise à l'état initial de la variable buffercount=-1
              //emplacement delay ne fct pas
      }
      delayMicroseconds(25);     //Avec delay 25µs si 250000 bauds .
                // SimTools 115200 bauds et 3ms en chaque envoie de trame, delayMicroseconds(250); est le minimum pour fonctionner.(Ne fct pas bien avec 200µs)
    }
  }                     
}

pour CD, FP et OVER: voir le registre US_BRGR page 843

pourquoi vouloir modifier le baudrate?

moi, j'avais fais ça pour un 8535 en stand alone que je surcadençais, et pour avoir la liaison série
il fallait modifier les valeur pour retomber sur les bonnes vitesses de transmission.

dfgh:
pourquoi vouloir modifier le baudrate?

Merci pour ta réponse.

En fait je chercher à configurer Serial 8 N1 de préférence sur le "Programming Port" à un baudrate à 0,00% d'erreur.

A défaut sur SerialUSB car j'ai un problème, le port Natif n'est pas toujours reconnu sur le même numéro de port COM. C'est gênant car il faut reconfigurer le logiciel sur PC (Il démarre automatiquement en cherchant le port que je lui déclaré lors de sa configuration)

La Due lit en permanence des trames de données sur 5 octets provenant d'un logiciel sur PC.
En cas de mauvais lecture la trame incorrecte est rejetée : Aucun problème car d'autres trames de 5 octet sont périodiquement envoyées sur le port série.

Mon problème N°1 est que j'ai besoin de recevoir une trame spécifique et unique déclarant le démarrage du logiciel et une seconde trame spécifique et unique lors de l'arrêt du logiciel.

Je m'aperçois que de façon rarement et de façon aléatoire, le code doit rejeter cette trame unique de démarrage ou d'arrêt pour cause de non conformité

Mon problème N°2 pouvant être lié au N°1 est que je dois mettre un delayMicroseconds(25) quand Serial fonctionne à 250000 bauds et delayMicroseconds(250) à 115200 bauds en fin du programme de lecture afin que la boucle Loop fonctionne.
(Code partiel au post 14)

Merci de me conseiller le baudrate le plus élevé tout en restant à ~ 0,00% d'erreur

Il n'est pas du tout évident que cela provienne d'un écart de valeur de baudrate.
En général un UART a une certaine tolérance.
Il peut s'agir aussi d'un problème de pollution électromagnétique sur un câble de liaison trop long et un baudrate trop élevé par exemple.

Bonjour et Merci pour ton avis technique

hbachetti:
Il n'est pas du tout évident que cela provienne d'un écart de valeur de baudrate.
En général un UART a une certaine tolérance.

Tu veux dire que avec une autre carte Arduino Due, je peux avoir un taux de rejet moins important !
(Tolérance des caractéristiques et de performance de l'UART à la fabrication du CI ?)

hbachetti:
Il peut s'agir aussi d'un problème de pollution électromagnétique sur un câble de liaison trop long et un baudrate trop élevé par exemple.

Actuellement cela ce passe sur un bureau :
Distance entre PC et Arduino :15cm
Le câble USB entre l'Arduino et le PC est blindé et il est d'une longueur de 60cm avec le câble plié en S
J'ai fais un essai l'Arduino écarté à 60cm du PC (câble sans boucle, quasiment tendu) et tous les multimètres déconnectés de l'Arduinu Due : Cela semble ne rien changer ! pas du 100% !...

hbachetti:
un baudrate trop élevé par exemple.

Quel serait le baudrate l'UART de la Due qui a un taux d'erreur le plus faible ?

"Mon problème N°2 pouvant être lié au N°1 est que je dois mettre un delayMicroseconds(25) quand Serial fonctionne à 250000 bauds et delayMicroseconds(250) à 115200 bauds en fin du programme de lecture afin que la boucle Loop fonctionne."
Cela te fait pensez à quelle piste ? C'est bizarre de devoir faire une pause après la lecture Serial !... Pause d'autant plus grande que le baudrate dimininue !...
A 115200 bauds , nécessité d'un pause 10 fois plus longue que à 250000 bauds!...

(Tolérance des caractéristiques et de performance de l'UART à la fabrication du CI ?)

Non, ce n'est pas une dispersion, c'est une tolérance logique. Un UART admet un pourcentage d'erreur, ce qui est logique, sinon toute transmission serait impossible.
Avec une autre carte cette tolérance sera la même.

"Mon problème N°2 pouvant être lié au N°1 est que je dois mettre un delayMicroseconds(25) quand Serial fonctionne à 250000 bauds et delayMicroseconds(250) à 115200 bauds en fin du programme de lecture afin que la boucle Loop fonctionne."

Absolument anormal, bug logiciel, forcément.