Gambas France BETA


Pas de compte ? Incription

Port série et temps de traitement

1
AuteurMessages
lapenduledargent#1 Posté le 12/4/2015 à 21:45:46
Bonjour à tous,

J'ai fait un digicode avec deux arduinos mega 2560 et gambas 3.7.
Un premier arduino lit le résultat de l'encodage du clavier.

Via le port série usb /dev/ttyACM0, il envoie le code à un programme en gambas.
Le programme en gambas vérifie dans la base de donnée mysql.
Si le code est validé, le programme en gambas envoie une commande via un autre port série à un second arduino /dev/ttyACM1.

Avec la commande "Print #SerialPortDomotique, Chr$(67)"

Voilà mes réglages de mes ports série en gambas :
Vitesse de 1200 bits/s.
Databits :8 bits
FlowControl : None
Parity : None
Stopbits : 1 bits

Ce second arduino ouvre la porte.

Avec un pc portable I5 et 4Gb de ram version de gambas 3.5.4, l'ouverture se fait immédiatement.
Avec un pc desktop un peu plus ancien, version de gambas 3.7, l'ouverture se fait au bout d'un certain temps variable,allant jusqu'à une trentaine de secondes :(

Dans une textbox, j'ai pu vérifier que ma requête mysql est validée rapidement.
C'est l'écriture sur le second port série qui traîne ???

Avez vous une explication ?

Pour être complet, voilà un extrait du second code arduino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
IF (Serial.available())
{

ValeurPortSerie=Serial.read();

switch (ValeurPortSerie)
{
CASE 48: // lecture du chiffre : 0
TestLed();
BREAK;

CASE 77: // lecture de la lettre : M
CodeMaster();
BREAK;

CASE 65: // lecture de la lettre : A
CodeAmi;
BREAK;

CASE 67: // lecture de la lettre : C
CodeClient;
BREAK;


}
}
Serial.flush();



spheris#2 Posté le 13/4/2015 à 14:27:17
lapenduledargent,

Quelqeus pistes de réflexion :

premiere explication :
En premier lieu vérifie si ton port est bien celui que tu veux piloter.
Linux parcourt peut-être les ports déclarés et trouve celui qu'il te faut au bout d'un certain temps.

deuxieme explication :
Vitesse de 1200 bits/s. me semble trop peu lent. pourquoi n'utilises-tu pas le 4800 minimum ou 9600 ?

troisieme explication :
Ton port d'envoi n'est-il pas occupé par autre chose au moment ou tu envoi la commande?
A vérifier...

quatrième explication :
Port série émulé sous USB, beark !!!!! ça ne marche pas vraiment terrible suivant les adaptateurs...
Si le pc est en fixe, pourquoi ne pas utiliser COM1 en standart?
et si tu utilises COM 1, le problème peut venir du BIOS de ton PC mal configuré.(interruption,adresse, etc...)

cinquième explication :
Tu reçois le chiffre 0 ? rebeurk! si j'étais toi, j'éviterai ce genre de quiproquo électronico-informatique. Un zéro n'est pas l'ami d'une chaine série.


Enfin et pour finir j'utilise le port série dans les deux sens sur GB3 depuis assez longtemps et si tu as un moment nous pourrions en discuter pour que je puisse faire un tuto simple et conci.
A bientôt
;)

petite remarque :
pourquoi construire une BDD sql juste pour y stocker le code de ton digicode. c'est un peu comme utiliser un tracto pelle pour enfoncer un clou, non ?
:lol: :lol:
lapenduledargent#3 Posté le 13/4/2015 à 22:40:24
Bonsoir Sphéris,

Merci pour ta longue réponse. ;)

En premier lieu vérifie si ton port est bien celui que tu veux piloter.


Dans mon programme arduino, j'ai un bouton qui permet de faire un test en direction d'un ou de l'autre arduino.

Vitesse de 1200 bits/s. me semble trop peu lent.


C'est à cette vitesse que j'ai le meilleur résulta pour la lecture du code.
Ma je peux essayer de l'augmenter sur le second arduino

Ton port d'envoi n'est-il pas occupé par autre chose au moment ou tu envoi la commande?

Tu penses à la souris, au clavier ? je vais tester avec LSUSB

Port série émulé sous USB, beark !!!!!

Tu penses à un module rs232.
Pour le zero, c'est justement ce qui fonctionne sans problème pour tester mes arduinos

Bonne idée ton tuto. Merci :)

Enfin j'utilise mysql dans le but de pouvoir à distance gérer mes autorisations d'accès.
J'ai un autre programme en gambas qui se connecte à la base pour cela.

Tu penses à un fichier texte ou à Sqlite ?

Le plus bizarre c'est qu'avec mon pc portable i5, c'est très rapide.

lapenduledargent#4 Posté le 15/4/2015 à 19:15:54
Bonsoir,


Je viens de porter la vitesse du second arduino à 9600 bits/sec mais ça change rien.
Bizarrement aujourd'hui nous avons constaté un temps variable entre 2 et +/- 30 secondes !!!
spheris#5 Posté le 16/4/2015 à 08:33:27
lapenduledargent,
Je pense avoir trouvé :

"Print #SerialPortDomotique, Chr$(67)"


ajoute un point virgule à la fin de cette phrase comme ceci :

1
PRINT #SerialPortDomotique, Chr$(67);


ou passe par une variable (problème de parenthèses dans la fonction PRINT série.

1
2
DIM montexte AS STRING
PRINT #SerialPortDomotique, montexte;


autre chose :
Renvois-tu ta chaîne à intervalle régulier ? dans ce cas là il doit peut être intercepter la chaine au bout d'un certain (long) temps...
car j'avais aussi un souci très minime. Le tout premier dialogue ne fonctionnait pas. MAintenant, J'envoi deux fois la même chaine au démarrage du soft et après tout fonctionne du premier coup.( peut etre une init à faire)

A bientôt.

;)
lapenduledargent#6 Posté le 18/4/2015 à 16:19:55
Bonjour Sphéris,

Non ça ne change rien !
J'ai parfois l'ouverture en seulement +/- 2 secondes ?

Renvois-tu ta chaîne à intervalle régulier ? dans ce cas là il doit peut être intercepter la chaine au bout d'un certain (long) temps...


Non, c'est pas régulier, c'est seulement lorsqu'un visiteur se présente et suivant son autorisation, j'ouvre une ou deux portes.

Je pense que je vais essayer avec encore un autre pc ou à la place du second port série, utiliser un shield arduino Ethernet et mon réseau Ethernet interne.



spheris#7 Posté le 18/4/2015 à 20:17:33
As-tu essayé sur un port standart type COM1 ?
Si oui quel est le résultat ?
lapenduledargent#8 Posté le 19/4/2015 à 14:23:59
Bonjour,

Non, je n'ai pas eu l'occasion, je suis fort occupé avec mon centre d'usinage.
Je reprends le projet début mai.

Bon dimanche à tous,

Pierre
spheris#9 Posté le 19/4/2015 à 17:29:24
Excuse moi de te demander cela, mais pourrai-tu me faire passer le code complet envoi/réception en RS232, je voudrais le potasser un peu...
xave4552#10 Posté le 26/10/2015 à 17:45:17
Bonjour à tous,
J'ai à peux pret la même expérience pour obtenir une réponses de l'arduino. J'ai pas mal potasser le sujet et j'en suis arriver à la conclusion que en fait l'arduino répond bien au donné que je lui envoi. De plus il me réponds, cependant ces gambas qui bug. Je m'explique et dite moi ce que vous pensé de la démarche.
Dans un premier temps voiçi le code source de l'arduino:
Il s'agit du code source que l'on trouve sur le site suivant:https://www.arduino.cc/en/Tutorial/SerialEvent
Je l'ai juste modifier pour qu'il me réponde 2 quand je lui envoie 1.

Port de l'arduino: /dev/ACM2 à cette instant.


String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete

void setup() {
// initialize serial:
Serial.begin(115200);
// reserve 200 bytes for the inputString:
inputString.reserve(200000);
}

void loop() {
serialEvent(); //call the function
// print the string when a newline arrives:
if (stringComplete) {
//Serial.println(inputString);
Serial.println(2);
// clear the string:
inputString = "";
stringComplete = false;
}
}

/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;

// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
stringComplete = true;
}
}
}

Cela fonctionne de manière impeccable avec l'environnement arduino, j'ai bien la réponse escompté avec l'environnement arduino.

Maintenant voiçi mon code gambas:
Nota: J'ai bien essayer de lire les donnés et de les envoyé sans conversion de type de caractère au cas ou si le bug vient de là, de toute manière cela est normalement rétro-compactible.


' Gambas module file

Private Com As Test
Private $Capteur As SerialPort
Private $Test_Capteur As Boolean

Private $Actionneur As SerialPort
Private $Test_Actionneur As Boolean

Private $Tmp_Capteur As SerialPort

Private $Tampon As String
Private Listage As String[]

Public Sub Main()
Dim Rx As String
Dim R As String
Dim i As Integer
Dim test As Boolean
Dim sOneLine As String
Dim tmp As String[]


test = False
$Tmp_Capteur = New SerialPort
$Tmp_Capteur.PortName = "/dev/ttyACM2"
$Tmp_Capteur.Speed = 115200
$Tmp_Capteur.Parity = 1
$Tmp_Capteur.DataBits = 7
$Tmp_Capteur.StopBits = 1


$Tmp_Capteur.Open()

If Error Then
Print "Impossible d'ouvrir le port suivant: " & $Tmp_Capteur.PortName
Endif
Print "Test du peripherique: " & "/dev/ttyACM2"

For i = 0 To 100

Print #$Tmp_Capteur, Conv("1", System.Charset, "ASCII")

Read #$Tmp_Capteur, Rx, Lof($Tmp_Capteur)
Print Conv(Rx, "ASCII", System.Charset); "\t"; Rx; "\t"; String.Code(Rx, 0); "\t"; i



Flush
Next

End


Ce que je constate c'est que mes données sont bien envoyés et j'ai bien une réponse, je le constate de deux manières:
Les led RX et TX de l'arduino s'allume bien quand je lance mon programme.
Mais en fouillant un peux j'ai remarqué que l'on pouvais voir ce qu'il transite par un port serie émulé en lancant la commande suivante dans un terminal: cat /dev/ttyACM2
En lancant cette commande j'ai bien l'envoie des donnée qui fonctionne mais aussi les réponse
Quant j'envoie 1 je reçois 2 le comportement est donc normal dans mon terminal, je pense que cela vient de gambas, sauf si vous avez une autre idée, mais bon je suis septique.
noucom#11 Posté le 2/11/2015 à 11:25:57
Bonsoir,
Ce probleme peut etre resolu par cette configuration:
Un arduino qui envoi et un qui réceptionne. Plus de probleme de latence ou autre.
1