Prob liaison port série VB2008

Signaler
Messages postés
22
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
6 septembre 2019
-
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
salut tout le monde,

Ca fait plusieurs heures que je cherche désespérement une solution pour communiquer avec une carte relais électronique velleman (K8056). Je dois communiquer par port série et lui envoyer une commande RS-232 de type (donné dans la doc):

-CHR$13
-adresse de la carte, par défaut = 1
-l'instruction 'S' en ASCII (ou 0x53), ce qui va activer un relais
-le numéro du relais soit '1' en ASCII (ou 0x31)
-checksum: cad le complément à 2 de la somme des 4 bytes précédent +1

voilà, en gros je n'arrive à rien envoyer...  voici ce que j'ai écrit, qqun voit il un prob??

Imports

System
Imports

System.IO.Ports
Public

Class Form1

Private
Sub Form1_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load

End
Sub

Private
Sub Send_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)

Dim checksum
As
Integer

Dim messagestring
As
String

Dim Relays
As
ByteRelays = 1

checksum = (255 - ((((13 + 1 + Asc(

"S") + (Relays)) / 256) - Int((13 + 1 + Asc(
"S") + (Relays)) / 256)) * 256)) + 1messagestring = Chr(13) & Chr(1) & Asc(

"S") & (Relays) & Chr(checksum)
messagestring = messagestring & messagestring

Dim com1
As IO.Ports.SerialPort =
My.Computer.Ports.OpenSerialPort(
"COM1", 2400, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)com1.WriteLine(messagestring)

com1.Close()

End
SubEnd

Class
Je suis en VB 2008 et j'essaie aussi avec VB2005 mais rien ne va. Je suis certain que la carte fonctionne parce qu'avec le prog démo de chez velleman (en VB6 malheureusement) elle communique bien via le port com.

qqun a t il des parties de codes que je pourrais tester juste pour l'envois de données via port com???

any ideas?

merci pour vos réponses

@+

PS j'ai tenté de tester le prog pas à pas mais quand je met un espion sur   Port.BytesToWrite  j'ai tjs 0 meme après le .WriteLine (messagestring), meme avec une valeur fixe de 1 , est normal? mon port est bien ouvert à ce moment là...

5 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Voici les octets que tu envoie avec ta méthode :
        0D 01 38 33 31 3F 0D 01 38 33 31 3F 0A

Le problème vient de Asc("S") qui renvoie 83 en décimal, convertie en string (puisque tu le met dans une string), ça donne les caractères 8 et 3 et donc les 2 octets 38 et 33 (en hex) au lieu de l'octet 53 en hex soit 83 en décimal.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
22
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
6 septembre 2019

salut merci d'avoir répondu si vite...
si je tape ça autrement:

Voici normalement les valeurs hex de la commande:

0D =13
01 =1
53 =83 ou 'S'
31 =49 ou 1 en ASCII
si je fais le checksum cela devrait donner - (FF - (0D+01+53+31)) -6D 0x12 non?

comment je dois les rentrer dans port.write? avec chr()? hex()? sans rien??

Port.Open()
Port.Write (Hex(0D) & Hex(1) & Hex(53) & Hex(31) & Hex(6D))
Port.Close()

merci pour ton aide
@+
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Attention, j'ai l'impression que tu mélange un peu tout.

Les valeurs que tu donne (0D, 01, 53, 31, ...) sont déjà des valeurs en Hexa. Il ne faut donc pas les convertir à nouveau en Hexa.

Pour ce qui est du checksum, la formule que tu donne dans le premier post, l'explication que tu donne dans le premier post, et la formule que tu emploi dans ton second post ne sont pas cohérentes. Vérifie bien qu'elle est la formule exacte à employer.

Pour ce qui est de la trame à envoyer, je commencais à partir sur des solutions complexes alors que il y a plus simple.

Je t'ai dis, tout à l'heure que le problème venait de Asc("S"). Puisque tu met tout dans une chaine de caractère, il suffit simplement de mettre dedans le caractère "S" et non une de ses quelconques valeurs.

messagestring = Chr(13) & Chr(1) & "S" & (Relays) & Chr(checksum)

---- Sevyc64  (alias Casy) ----<hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
22
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
6 septembre 2019

Salut casy!


voilà je viens de trouver l'erreur. C'était bien un problème de communication... je récapitule: la commande que je devais envoyer en hexa était 0D (chr13$), 01 (adresse carte), 53 (caractère 'S'), 31 (numéro du relais, ici le n° 1 en ASCII), 6E (checksum)


Pour le checksum [FF-(OD+01+53+31)]+1 soit 6E.

voici le prog qui fonctionne:


Imports System

Imports System.IO.Ports

Public
Class Form1

Dim Port
As IO.Ports.SerialPort =
My.Computer.Ports.OpenSerialPort(
"COM1", 2400, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)



Private



Sub
Form1_Load(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles



MyBase
.Load



Port.Close()



End




Sub









Private




Sub

Essai_Click(

ByVal

sender

As

System.Object,

ByVal

e

As

System.EventArgs)

Handles

Essai.Click


Dim

messagestring

As




String


messagestring = Chr(13) & Chr(1) &




"S"

& Chr(49) & Chr(110)  'chiffres en decimales

messagestring = messagestring & messagestring
messagestring = messagestring & messagestringPort.Open()
Port.Write(messagestring)
Port.Close()


End




Sub
End




Class



un tout grand merci pour ton aide!! J'ai encore une petite question, je voudrais utiliser une tempo entre 2 relais de plusieurs minutes par ex, qu est ce que tu me conseilles d'utiliser.
entre 2 commande de relais je voudrais par exemple attendre 5 min.

merci pour ton aide
@+
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Tu as plusieurs possibilités.

Tu peux utiliser la fonction Sleep qui va geler ton programme durant le temps voulu.
Tu peux aussi utiliser un timer

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php