Prb com port série : Avis aux experts

Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007 - 27 oct. 2006 à 20:35
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007 - 29 oct. 2006 à 17:34
Bonjour a tous.

Voici mon problème. Je dispose d'un terminal de lecture de codebar communiquant par le port série. J'essaye tant bien que mal de communiquer par le port série avec ce terminal. N'étant pas un grand expert en programmation C, j'utilise un code source trouvé sur ce site : www.cppfrance.com/codes/FONCTION-GESTION-PORT-SERIE-OUVERTURE-EMISSION-RECEPTION_11115.aspx

A priori, la fonction marche plutôt bien, j'arrive a envoyer des données sur le port com. Je ne connais pas le code souce du terminal. Pour comprendre son fonctionnement, j'utilise un sniffer de port comm pour comprendre son protocole de communication.

Le principe est plutot simple, on envoie des caractères au terminal qui réponds et lance une procédure d'upload si on lui parle gentillement. Plutot que de faire de grands discours, je vais mettre le début des captures d'échange pour le programme original et le mien.

voici le début de l'échange entre le terminal et le prog constructeur :
Port opened by process "AG8000N.exe" (PID: 260)

Request: 27/10/2006 19:54:40.32564 (+215.7302 seconds)
0F 0F .. nswer: 27/10/2006 19:54:40.95564 (+0.1001 seconds)

0F . Request: 27/10/2006 19:54:41.17664 (+0.2203 seconds)

07 32 51 52 45 41 44 0D .2QREAD. Answer: 27/10/2006 19:54:41.75764 (+0.0300 seconds)

4E 41 4B 0D NAK. Request: 27/10/2006 19:54:41.75764 (+0.0000 seconds)

52 45 41 44 0D READ.
Answer: 27/10/2006 19:54:41.77764 (+0.0200 seconds)

et voici l'échange entre le terminal et mon programme :

Port opened by process "test.exe" (PID: 1688)

Request: 27/10/2006 20:24:46.25464 (+45.4153 seconds)

 0F 0F 07 36 51 52 45 41 44                        ...6QREAD       

Port closed

Les donnes semblent groupées, pourtant je les envoies identiquements a ci dessus.

En rédigeant ce message je me suis rendu compte qu'entre chaque groupe de données il y avait une renégociation des
paramètres de connexions (qui n'apparaissent pas ici puisque que ces échanges se font sur les broches de controles.
Seul problème je ne sais pas comment renégocier ces paramètres sans fermer le port de communication 
( si la est la réponse )

juste pour information voici la renégociation entre chaque groupe de données : attention c'est assez indigeste :



<col style=\"width: 430pt;\" width=\"573\" />----
2,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_PURGE: Purge requests),DOWN,TRUE,0x0,0F 00 00 00 ,....,, ----
3,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_PURGE: Purge requests),UP,FALSE,0x0,,,, ----
4,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,, ----
5,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,80 25 00 00
,?%..,, ----
6,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,, ----
7,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08
,...,, ----
8,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,, ----
9,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00
11 13 ,......,, ----
10,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,, ----
11,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,00 00
00 00 40 00 00 00 00 70 00 00 00 1C 00 00 ,....@....p......,, ----
12,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),DOWN,FALSE,0x0,,,, ----
13,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_BAUD_RATE: Retrieve Baud Rate),UP,TRUE,0x0,80 25 00 00
,?%..,, ----
14,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),DOWN,FALSE,0x0,,,, ----
15,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_LINE_CONTROL: Retrieve line control),UP,TRUE,0x0,00 00 08
,...,, ----
16,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_CHARS: Retrieve special characters),DOWN,FALSE,0x0,,,, ----
17,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_CHARS: Retrieve special characters),UP,TRUE,0x0,00 00 00 00
11 13 ,......,, ----
18,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),DOWN,FALSE,0x0,,,, ----
19,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_GET_HANDFLOW: Retrieve handshake information),UP,TRUE,0x0,00 00
00 00 40 00 00 00 00 70 00 00 00 1C 00 00 ,....@....p......,, ----
20,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),DOWN,TRUE,0x0,80 25 00 00 ,?%..,, ----
21,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate),UP,FALSE,0x0,,,, ----
22,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_RTS: Set RTS),DOWN,FALSE,0x0,,,, ----
23,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_RTS: Set RTS),UP,FALSE,0x0,,,, ----
24,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_CLR_DTR: Clear DTR),DOWN,FALSE,0x0,,,, ----
25,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_CLR_DTR: Clear DTR),UP,FALSE,0x0,,,, ----
26,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),DOWN,TRUE,0x0,00 00 08
,...,, ----
27,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_LINE_CONTROL: Set line control),UP,FALSE,0x0,,,, ----
28,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_CHARS: Set special characters),DOWN,TRUE,0x0,00 00 00 00 11
13 ,......,, ----
29,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_CHARS: Set special characters),UP,FALSE,0x0,,,, ----
30,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),DOWN,TRUE,0x0,00 00 00
00 40 00 00 00 00 70 00 00 00 1C 00 00 ,....@....p......,, ----
31,IRP_MJ_DEVICE_CONTROL
(IOCTL_SERIAL_SET_HANDFLOW: Set handshake information),UP,FALSE,0x0,,,

Merci a tous ceux qui auront le courage de se pencher sur mon problème            
                

5 réponses

Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
27 oct. 2006 à 20:40
Ah oui au fait j'ai juste oublié de dire que j'utilise les mêmes paramètres que ceux du terminal c'est a dire  115200 bauds, pas de parité, pas de controle de flux,  et 1 bit de stop.

Merci
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 oct. 2006 à 23:03
Tu utilises quel sorte de douchette code a bar ?
En logique les lecteur CAB envoie des caractères de début et fin de trame : ETX et STX

Tu devrais donc essayer d'envoyer ces trames la :

Request: 27/10/2006 19:54:40.32564 (+215.7302 seconds)
02 0F 0F 03 .. nswer: 27/10/2006 19:54:40.95564 (+0.1001 seconds)

02 0F 03 . Request: 27/10/2006 19:54:41.17664 (+0.2203 seconds)

02 07 32 51 52 45 41 44 0D 03 .2QREAD. Answer: 27/10/2006 19:54:41.75764 (+0.0300 seconds)

02 4E 41 4B 0D 03 NAK. Request: 27/10/2006 19:54:41.75764 (+0.0000 seconds)

02 52 45 41 44 0D 03 READ.

Shell
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
28 oct. 2006 à 13:50
Le problème n'est pas sur les caractères que j'envoie puisque qu'ils sont identiques a ceux émis par le programme constructeur. Soit dit en passant, les lignes rouges représentent les data que j'ai émis sur le canal série, et en bleue celles reçues.

Le truc c'est qu'entre chaque  paquet de données émit, il a y une sorte de renégociation des paramètres de transmission que je n'ai pas chez moi

Sinon, j'ai bien essayé de rajouté des caractères de début et fin mais cela n'a aucun effet.
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
28 oct. 2006 à 14:26
Au lieu de passer par une cource de cppfrance dont tu ne sais pas si elle est 100% compatible essaye deja avec le HyperTerminal de windows.
Tu bosses sur quel marque de douchette au fait ?

Shell
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
29 oct. 2006 à 17:34
Alors en faite, je ne suis pas non plus un pro des codebars. le terminal est compatible avec un paquet de normes différentes. Maintenant pour l'hyperterminal, le programme de capture des datas sur le port com me permet d'envoyer des données dessus directement depuis le clavier. J'arrive à faire réagir le terminal  si je rentre des charactères.
0
Rejoignez-nous