Fredleemans
Messages postés22Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention 6 septembre 2019
-
16 janv. 2009 à 17:24
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 2014
-
19 janv. 2009 à 14:08
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 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à...
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 16 janv. 2009 à 17:58
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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 16 janv. 2009 à 20:30
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.
Fredleemans
Messages postés22Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention 6 septembre 2019 19 janv. 2009 à 13:15
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)
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
@+
Vous n’avez pas trouvé la réponse que vous recherchez ?