Bonsoir,
Citation:
C'est noté
Merci pour le report, car ils ne sont pas légion.
De rien
. Là où je m'en veux, c'est d'avoir cherché partout une interface cc90 232, et finalement en acheter une sur ebay et après découvrir que je pouvais la commander sur le site de PULS. :-/
Comme promis, j'ai modifié la version Linux. Ma première modification a été de modifier la fonction Waitcycles à l'aveuglette en rajoutant +1000. ça fonctionnait mais ça ne me convenait pas, du grand n'importe quoi
.
Par contre, je n'ai pas trop compris la multiplication par 10 des cycles. Je n'espère pas dire de bétises, mais il me semble qu'un cycle sur Thomson fasse 1 us?
Donc dans cette optique et n'étant pas du tout fan de gettimeofday et préférant une meilleure précision, j'ai écrit une fonction Waitcycles, et j'ai modifié par ailleurs la fonction SerialWrite, Pour ajouter ce waitcycles, car la valeur de retour n'est pas toujours garantie avec write :
Citation:
Man write
If a write() is interrupted by a signal handler before any bytes are
written, then the call fails with the error EINTR; if it is interrupted
after at least one byte has been written, the call succeeds, and
returns the number of bytes written.
Je viens de tester sur Fedora 27 64 bits, aucun soucis, tocomm peut ainsi envoyer des chaines de 255 caractères en mode 8 (donc 19200 bauds)
.
Pour compiler avec cette nouvelle cette nouvelle version de Waitcycles, il faut remplacer l'include
Code:
#include <sys/time.h>
par
Code:
#include <time.h>
Voici les deux fonctions que j'ai modifiées (édit : fichier toserial.c du repertoire linux):
Code:
/*
* Attend le nombre de cycles nécessaires à l'absorbtion de la donnée
*/
static void WaitCycles(void)
{
struct timespec timecycles;
timecycles.tv_sec=0;
//Attendre x cycles +1
timecycles.tv_nsec=(1000*baudtable[baudrate].cycles)+1000;
clock_nanosleep(CLOCK_REALTIME, 0, &timecycles, NULL);
}
/*
* Envoie le bloc de données asynchrones sur le port série
*/
int
SerialWrite(char c) /*@globals errno@*/
{
/* Envoie la donnée au Thomson */
switch (write(fileDescriptor, &c, 1))
{
case 1 : WaitCycles(); return 1 ;
case 0 : WaitCycles(); return 0 ;
}
WaitCycles();
return -1 ;
}
Comme ça je suis sûr que le waitCycles est bien effectué
Voila, Maintenant chez moi Tocomm est pleinement fonctionnel sous Linux et Windows 10
.
Concernant la doc, j'ai une petite suggestion à faire également :
Préciser aux utilisateurs en cas de problème qu'ils peuvent essayer de forcer la vitesse de leur port série sous Linux en faisant la commande
Code:
stty -F /dev/ttyPORTCXOMM VITESSE
Par exemple pour 19200 sur un PL2303 USB SERIE
stty -F /dev/ttyUSB0 19200
Cette option est disponible aussi pour WINDOWS 10 dans le gerstionnaire de périphériques dans les propriétés du port.
Concernant les drivers PL2303, il existe un nombre incalculable de copies asiatiques, et dûr dûr de faire la différence avec un vrai (j'y ai eu le droit). Prolific, le fabricant de la puce, avec les nouveaux drivers, les empèche de démarrer (Erreur 10) sous WINDOWS (linux aucun soucis). L'utilisation de drivers antérieurs (3.3 si ma mémoire est bonne car je suis sous linux en ce moment), permet de les utiliser sans aucun soucis
.
Si tu veux, et si cela est plus pratique, je pourrais t'envoyer les fichiers modifiés.
Bonne soirée, et encore merci pour ces programmes sympathiques en partage
Thomas