OVH Cloud OVH Cloud

Utilisation de Mscomm à1800 bauds

4 réponses
Avatar
martin_edith
Voici mon problème :
Mon application doit communiquer avec un interface via le prot série à
une vitesse de 1800 bauds. Mscomm n'utilise pas cette valeur.
J'ai trouvé une façon pour forcer la propriété "setting" de mon mscomm
pour pouvoir le paramètrer à "1800,N,8,1"
J'envoie la commande sur le port via le mscomm et elle est bien
tranmise à mon interface.
Sauf que, lorsque celle-ci me répond, je ne peux lire le buffer.
L'événement OncommEvent n'est jamais appeller...
J'utilise un sniffer pour voir les commandes sur le port série.

Je vois celles que j'envoie mais pas celle qui me sont transmisent.
Il y a un led sur l'interface pour m'indiqué qu'elle me réponds.

Donc, je peux transmettre mais, je ne peux lire ce qui m'est retourné
lorsque je paramètre mon objet mscomm à 1800 baud.

Quelqu'un peut-il m'indiqué comme y parvenir.

N.B. Je ne suis pas famillier avec les API...

Merci à l'avance.
Martin

Voici le code que j'utilise pour forcer le mscomm a être paramétré à
1800 baud.
---------------------------------------------------------------
Sub SetBaudRate(Com As MSComm, baud As Long)
Dim ComDcb As dcb
Dim ret As Long

' Check port is open
If Not Com.PortOpen Then
Err.Raise comPortNotOpen, Com.Name, _
"Operation valid only when the port is open"
Exit Sub
End If

' Get existing Comm state
ret = GetCommState(Com.CommID, ComDcb)
If ret = 0 Then
Err.Raise comDCBError, Com.Name, _
"Could not read current state of the port"
Exit Sub
End If

' Modify state with new baud rate
ComDcb.BaudRate = baud
' Set the new Comm state
ret = SetCommState(Com.CommID, ComDcb)
If ret = 0 Then
Err.Raise comSetCommStateFailed, Com.Name, _
"Could not set port to specified baud rate"
Exit Sub
End If
End Sub
------------------------------------------------
Function GetBaudRate(Com As MSComm) As Long
Dim ComDcb As dcb
Dim ret As Long

GetBaudRate = 0

' Check port is open
If Not Com.PortOpen Then
Err.Raise comPortNotOpen, Com.Name, _
"Operation valid only when the port is open"
Exit Function
End If

' Get Comm state
ret = GetCommState(Com.CommID, ComDcb)
If ret = 0 Then
Err.Raise comDCBError, Com.Name, _
"Could not read current state of the port"
Exit Function
End If

' Extract baud rate
GetBaudRate = ComDcb.BaudRate
End Function

4 réponses

Avatar
>-----Message d'origine-----
Voici mon problème :
Mon application doit communiquer avec un interface via le


prot série à
une vitesse de 1800 bauds. Mscomm n'utilise pas cette


valeur.
J'ai trouvé une façon pour forcer la propriété "setting"


de mon mscomm
pour pouvoir le paramètrer à "1800,N,8,1"
J'envoie la commande sur le port via le mscomm et elle


est bien
tranmise à mon interface.
Sauf que, lorsque celle-ci me répond, je ne peux lire le


buffer.
L'événement OncommEvent n'est jamais appeller...
J'utilise un sniffer pour voir les commandes sur le port


série.

Je vois celles que j'envoie mais pas celle qui me sont


transmisent.
Il y a un led sur l'interface pour m'indiqué qu'elle me


réponds.

Donc, je peux transmettre mais, je ne peux lire ce qui


m'est retourné
lorsque je paramètre mon objet mscomm à 1800 baud.

Quelqu'un peut-il m'indiqué comme y parvenir.

N.B. Je ne suis pas famillier avec les API...

Merci à l'avance.
Martin

Voici le code que j'utilise pour forcer le mscomm a être


paramétré à
1800 baud.
----------------------------------------------------------


-----
Sub SetBaudRate(Com As MSComm, baud As Long)
Dim ComDcb As dcb
Dim ret As Long

' Check port is open
If Not Com.PortOpen Then
Err.Raise comPortNotOpen, Com.Name, _
"Operation valid only when the port is open"
Exit Sub
End If

' Get existing Comm state
ret = GetCommState(Com.CommID, ComDcb)
If ret = 0 Then
Err.Raise comDCBError, Com.Name, _
"Could not read current state of the port"
Exit Sub
End If

' Modify state with new baud rate
ComDcb.BaudRate = baud
' Set the new Comm state
ret = SetCommState(Com.CommID, ComDcb)
If ret = 0 Then
Err.Raise comSetCommStateFailed, Com.Name, _
"Could not set port to specified baud rate"
Exit Sub
End If
End Sub
------------------------------------------------
Function GetBaudRate(Com As MSComm) As Long
Dim ComDcb As dcb
Dim ret As Long

GetBaudRate = 0

' Check port is open
If Not Com.PortOpen Then
Err.Raise comPortNotOpen, Com.Name, _
"Operation valid only when the port is open"
Exit Function
End If

' Get Comm state
ret = GetCommState(Com.CommID, ComDcb)
If ret = 0 Then
Err.Raise comDCBError, Com.Name, _
"Could not read current state of the port"
Exit Function
End If

' Extract baud rate
GetBaudRate = ComDcb.BaudRate
End Function
.




Bonjour,

J'utilise souvent MSCOMM pour développer des protocoles
série (XMODEM - PeSIT etc....)
Je pense qu'il faut paramétrer le port com avant son
ouverture.

Jean
Avatar
Gilles RONSIN
(Martin), le dim. 06 juin 2004 05:46:18,
écrivait ceci:

Salut,

Voici mon problème :
Mon application doit communiquer avec un interface via le prot
série à une vitesse de 1800 bauds. Mscomm n'utilise pas cette



A ma connaissance, 1800 bauds n'est pas un standard de communication !!
les vitesses de communications ne sont pas paramétrée pas logiciel,
mais sont gérées par le composant de sérialisation (carte série). Si
ton interface ne le gère pas, VB n'y pourra rien.
Le seul moyen à mon avis est de faire un câble spécial (par exemple qui
inverse le Tx avec RTS) et de gérer les communications en basculant
l'état de RTS. (j'ai fait ça il y a longtemps, si je retrouve quelque
chose je le poste)

--
Embryon de site : http://gilles.ronsin.free.fr
Nouvelles astuces : Interprêtation des évenements XP en "français"
(trad auto)
Il est impossible pour un optimiste d'être agréablement surpris.
Avatar
martin_edith
Gilles RONSIN wrote in message news:...


A ma connaissance, 1800 bauds n'est pas un standard de communication !!
les vitesses de communications ne sont pas paramétrée pas logiciel,
mais sont gérées par le composant de sérialisation (carte série). Si
ton interface ne le gère pas, VB n'y pourra rien.
Le seul moyen à mon avis est de faire un câble spécial (par exemple qui
inverse le Tx avec RTS) et de gérer les communications en basculant
l'état de RTS. (j'ai fait ça il y a longtemps, si je retrouve quelque
chose je le poste)




Il s'agit d'une interface qui date de qq années qu'un copain a conçu.
C'est pour cela que je retrouve a devoir travailler avec une vitesse
non standard.
Il y avait un petit programme en DOS qui la gérait.
Je suis entrain de lui faire un programme windows pour cette
interface.
Lorsque j'utilise le programme DOS, je vois les commandes entrées et
sortir sur le port série via le sniffer.
Donc ma carte série supporte une vitesse de 1800 bauds.
En DOS, il paramètrait le port et non l'objet mscomm comme je dois le
faire.

J'attend de vos nouvelles.

Merci!
Avatar
Alfred Wallace
Bonjour,

Ton programme atteignait sans doute directement les registres de l'UART. Je
le faisais en assembleur il y a de cela quelques décennies pour gagner en
vélocité à 1200 bds ou lorsque l'on se retrouvait avec des cartes I/O en
Com3..

Cela doit toujours être possible à faire, mais les OS récents empêchant
l'accès direct au matériel, je pense qu'il te faut réaliser ton propre
"Device driver" ou pilote en francais.

Le SDK permet de le faire, il te faudrait jeter ton oeil de ce coté là.
A défaut, il existe aussi la possibilté d'utiliser un assembleur 32 bits
pour migrer ton code, mais je ne sais si l'OS acceptera.

Malgré tout, je pense qu'un coup de fil au ST Microsoft pour vérifier les
vitesses du composant MSCOMM serait justifier avant de chercher d'autres
pistes.

Bon courage
Luc

"Martin" a écrit dans le message de
news:
Gilles RONSIN wrote in message


news:...
>
>
> A ma connaissance, 1800 bauds n'est pas un standard de communication !!
> les vitesses de communications ne sont pas paramétrée pas logiciel,
> mais sont gérées par le composant de sérialisation (carte série). Si
> ton interface ne le gère pas, VB n'y pourra rien.
> Le seul moyen à mon avis est de faire un câble spécial (par exemple qui
> inverse le Tx avec RTS) et de gérer les communications en basculant
> l'état de RTS. (j'ai fait ça il y a longtemps, si je retrouve quelque
> chose je le poste)


Il s'agit d'une interface qui date de qq années qu'un copain a conçu.
C'est pour cela que je retrouve a devoir travailler avec une vitesse
non standard.
Il y avait un petit programme en DOS qui la gérait.
Je suis entrain de lui faire un programme windows pour cette
interface.
Lorsque j'utilise le programme DOS, je vois les commandes entrées et
sortir sur le port série via le sniffer.
Donc ma carte série supporte une vitesse de 1800 bauds.
En DOS, il paramètrait le port et non l'objet mscomm comme je dois le
faire.

J'attend de vos nouvelles.

Merci!