Communication AutoIt - Arduino

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Quintinius
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 30 mars 2020 21:41
Localisation : Saint-Aubin (91)
Status : Hors ligne

Communication AutoIt - Arduino

#1

Message par Quintinius »

Bonjour tout le monde,

Comme l'indique le sujet je ne parviens pas à faire communiquer un programme AutoIt avec une carte Arduino, je bloque au stade d'ouverture du port série avec le script AutoIt.

L'Arduino envoi en permanence la chaine de caractère "Arduino" sur le port COM3 avec un baudrate de 9600, caractère par caractère toute les demi-seconde.

J'ai d'abord essayé d'utiliser l'UDF "CommMG.au" publié ici : https://www.autoitscript.com/forum/topi ... ent-341916, en appliquant des exemples vus sur des forums (comme je ne suis pas à l'aise en programmation c'est le plus rapide pour moi).

Le premier script que j'ai essayé est celui de cutprod ici : https://autoitscript.fr/forum/viewtopic.php?t=11236 - Pour communiquer par USB avec des cartes type "Arduino", le script affiche un moniteur dans lequel est sensé défilé les messages envoyés sur le port COM. Résultat : rien sur moniteur du script et je peux me mettre sur le port COM avec un autre logiciel comme PuTTY ce qui signifie que le script n'ouvre même pas le port COM. Le deuxième que j'ai essayé : viewtopic.php?t=14725 -> même résultat. L'UDF utilise un DLL, que j'ai à chaque fois mis dans le dossier du script puis essayé avec _CommSetDllPath pour vérifier si l'erreur ne venait pas de là. Le port COM et le baudrate correspondent.

Ensuite j'ai utilisé l'exemple de l'API (https://www.autoitscript.com/wiki/CommAPI) ci-dessous :
#include <CommInterface.au3>

Func Example()
    Local $hFile = _CommAPI_OpenCOMPort(3, 9600, 0, 8, 1)
    If @error Then Return SetError(@error, @ScriptLineNumber)

    Local $sResult = ""
    While True
        $sResult = _CommAPI_ReceiveString($hFile, 5000, 0, "<CR>")
        If @error Then Return SetError(@error, @ScriptLineNumber, $sResult)
        MsgBox(64, "Line", $sResult)
    WEnd

    _CommAPI_ClosePort($hFile)
    If @error Then Return SetError(@error, @ScriptLineNumber, $sResult)

    Return $sResult
EndFunc
Qui ne donne rien non plus. Ne retourne pas d'erreur.

Avant de poster mon message j'ai cherché les erreurs en m'appuyant la doc des fonctions, etc. mais rien a faire je ne vois pas d'où peut venir l'erreur. D'autant plus que ça semble marcher chez les autres. Je me demande si le problème ne vient pas d'une configuration. J'ai remarqué quelque chose d'étrange, c'est que le baudrate sur lequel je règle mes moniteurs (PuTTY ou celui de l'IDE Arduino) ne semble pas influer sur le message : je le met à 300 comme à 500000 je reçois toujours la même chose.
~
"Quand on voit ce qu'on voit, que l'on entend ce qu'on entend et que l'on sait ce que qu'on sait, on a raison de penser ce qu'on pense."

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11556
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Communication AutoIt - Arduino

#2

Message par Tlem »

Bonjour Quintinius.
Concernant l'exemple que vous avez testé, avez-vous bien récupéré l'ensemble des fichiers AU3 ?
  • CommAPIConstants.au3
  • CommAPI.au3
  • CommAPIHelper.au3
  • CommUtilities.au3
  • CommInterface.au3
  • CommObsolete.au3
Dans le code d'exemple que vous avez copié/collé, on voit bien une fonction, mais à aucun moment elle n'est appelée. :roll:
Du coup je vous suggère de rajouter Example() juste après #include <CommInterface.au3>
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
Quintinius
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 30 mars 2020 21:41
Localisation : Saint-Aubin (91)
Status : Hors ligne

Re: Communication AutoIt - Arduino

#3

Message par Quintinius »

Bonjour Tlem,

Merci d'avoir répondu aussi rapidement, il me manquait "CommObsolete.au3" je l'ai ajouté dans mon fichier d'UDF ainsi que le Example().

Le résultat est toujours le même, après appui sur F5 le moniteur affiche une série de lignes puis reste en pause pendant environ 7 secondes à partir de la ligne affichant "--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop" et après il affiche ">Exit code: 0 Time: 6.238". J'ai lancé PuTTY ensuite pour bien vérifier que mon Arduino envoi des caractères sur COM3 et c'est ok.

Un sreenshot de mon écran à ce moment là :
screenshot-aide1.png
~
"Quand on voit ce qu'on voit, que l'on entend ce qu'on entend et que l'on sait ce que qu'on sait, on a raison de penser ce qu'on pense."

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11556
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Communication AutoIt - Arduino

#4

Message par Tlem »

Re.
Rajoutez la ligne If @Error Then MsgBox(16, "Erreur", "Erreur N°" & @Error & " ligne " & @extended) juste après Example().

En fonction de l'erreur affichée, cela viendra soit de la fonction _CommAPI_OpenCOMPort(), soit de la fonction _CommAPI_ReceiveString().
Il vous suffira d'aller lire la liste des erreurs correspondantes dans le fichier : CommInterface.au3


PS : Merci de charger les images directement sur le forum et non sur un site externe.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
Quintinius
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 30 mars 2020 21:41
Localisation : Saint-Aubin (91)
Status : Hors ligne

Re: Communication AutoIt - Arduino

#5

Message par Quintinius »

J'ai l'erreur N°-2 ligne 16, donc j'imagine que le problème viens de la fonction _CommAPI_ReceiveString() ligne 15.. Ça correspond à une erreur de "timeout" d'après la description de la fonction.

Dans la fonction _CommAPI_ReceiveString($hFile, $iTimeout, $iMaxLength, $sSeparator, $iFlag) si je modifie la valeur de la variable $iTimeout ça à pour effet de ralentir ou accélérer l'arrivée du message d'erreur (proportionnellement).

PS : C'est noté pour les images, je n'avais pas remarqué l'onglet "Fichiers joints"
~
"Quand on voit ce qu'on voit, que l'on entend ce qu'on entend et que l'on sait ce que qu'on sait, on a raison de penser ce qu'on pense."

Avatar du membre
Quintinius
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 30 mars 2020 21:41
Localisation : Saint-Aubin (91)
Status : Hors ligne

Re: Communication AutoIt - Arduino

#6

Message par Quintinius »

Ah, et l'ouverture du port COM fonctionne bien, j'ai fait un test en mettant un $iTimeout assez long de manière à avoir le temps d'ouvrir le port avec PuTTY et il me dit bien que le port est ouvert par un autre logiciel.
~
"Quand on voit ce qu'on voit, que l'on entend ce qu'on entend et que l'on sait ce que qu'on sait, on a raison de penser ce qu'on pense."

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11556
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Communication AutoIt - Arduino  

#7

Message par Tlem »

Peut être est-ce lié au paramètre "<CR>"
Vous avez lu les exemples complémentaires de cette page : https://www.autoitscript.com/wiki/CommAPI_Examples
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
Quintinius
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 30 mars 2020 21:41
Localisation : Saint-Aubin (91)
Status : Hors ligne

Re: Communication AutoIt - Arduino

#8

Message par Quintinius »

Résultat des deux premiers exemples :
« First example » avec $sResult = _CommAPI_ReceiveString($hFile, 5000, 0, "<CR>") : MsgBox « Timeout » sans message d’erreur
« INI file » avec $sResult = _CommAPI_ReceiveString($hFile, IniRead($sFileINI, "Timeout", "IDSR", 5000)) : MsgBox « Result » affichant un caractère envoyé sur le port COM (A, r, d, u, i, ou o). Ça fonctionne :D

Donc j’avais bien un problème de paramètres dans la fonction _CommAPI_ReceiveString qui doit être _CommAPI_ReceiveString($hFile, 0)… Tout simplement.

En plus, j’avais un problème de paramètres dans la fonction _CommAPI_OpenCOMPort : il faut que les paramètres « CTS », « DTR » et « RTS » soient à 1 pour que ça fonctionne dans mon cas, sinon le programme ouvre le port COM sans afficher de résultat et se bloque. Pour régler ces paramètres il faut faire appel à la fonction _CommAPI_CreateModeString comme dans l’exemple « INI file »

Ci-dessous un script qui fonctionne chez moi :
#include <CommInterface.au3>

#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7

Main()
If @Error Then MsgBox(16, "Erreur", "Erreur N°" & @Error & " ligne " & @extended)

Func Main()
   Local $sResult = Example()
   Switch @error
      Case 0
         MsgBox(64, "Result", $sResult)
      Case -1
         MsgBox(32, "Error", _WinAPI_GetLastErrorMessage())
      Case -2
         MsgBox(32, "Timeout", $sResult)
      Case Else
         MsgBox(32, "Error", "Error " & @error & " in line " & @extended)
   EndSwitch
EndFunc


Func Example()

   Local $sMode = _CommAPI_CreateModeString(3,9600,0,8,1,0,0,1,1,1,0)
   ; _CommAPI_CreateModeString(SerialPort, BaudRate, Parity, ByteSize, StopBits, XON, DSR, CTS, DTR, RTS, IDSR)
   If @error Then Return SetError(@error, @ScriptLineNumber)

   Local $hFile = _CommAPI_OpenPort($sMode)
   If @error Then Return SetError(@error, @ScriptLineNumber)

   _CommAPI_ClearCommError($hFile)
   If @error Then Return SetError(@error, @ScriptLineNumber)

   _CommAPI_PurgeComm($hFile)
   If @error Then Return SetError(@error, @ScriptLineNumber)

   Local $sResult = _CommAPI_ReceiveString($hFile, 0)
   If @error Then Return SetError(@error, @ScriptLineNumber, $sResult)

   _CommAPI_ClosePort($hFile)
   If @error Then Return SetError(@error, @ScriptLineNumber, $sResult)

   Return $sResult
EndFunc
Merci beaucoup Tlem pour votre temps !
~
"Quand on voit ce qu'on voit, que l'on entend ce qu'on entend et que l'on sait ce que qu'on sait, on a raison de penser ce qu'on pense."

Répondre