Connection avec une balance via rs 232

cs_mat1x Messages postés 8 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 2 février 2010 - 28 janv. 2010 à 11:51
cs_mat1x Messages postés 8 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 2 février 2010 - 2 févr. 2010 à 10:14
Bonjour
j'ai un petit problème sur un développement que je doit effectuer en vb2008;
le but de cette application est de pouvoir envoyer deux trames a une balance industrielle avec un dispositif d'affichage DIP206, par une liaison RS232, et de recevoir suite a l'envoi des trames le poids affiché sur le dispositif DIP206, la ou ce situe mon problème et que je n'arrive a recevoir le poids afficher, j'utilise le composant serialport avec un datareceived j'ai pu voir que pour utiliser le datareceived je devait utiliser un Invoke,
mais la non plus sa ne fonctionne pas.
Le code que je fourni et mon code deu datareceived et de la fonction affichage, j'ai aussi essayer d'utiliser un timer mais la idem sa ne fonctionne pas.
ps: j'arrive a utiliser ce programme (avec et sans timer)en connectant mon cable rs232 sur un autre pc ou j'ai configurer un hyperterminal et cela marche

 Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
        Dim nb_octet As Integer = RS232.BytesToRead
        Dim trame(nb_octet - 1) As Byte

        RS232.Read(trame, 0, nb_octet)
        Text = System.Text.Encoding.ASCII.GetString(trame)
        Me.Invoke(New _Affiche_reception(AddressOf affichage), texte)
 
    End Sub

    Private Sub affichage(ByVal texte As String)
        lbl_poids.Text = texte

    End Sub


et j'utilise c'est deux ligne pour envoyer les trames :
 RS232.Write(trame1 & vbCrLf)
 RS232.Write(trame2 & vbCrLf)


merci de votre aide
Mat1x

7 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
28 janv. 2010 à 18:34
Salut
Hélas, je ne saurais te répondre, mais regarde bien tes lignes :
A la réception, tu stockes la 'trame' dans une variable nommée "Text" (mal choisie) et, à la ligne suivante, tu utilises 'texte'.

Qu'est ce qui te dit que les données reçues seront des caractères ASCII ?
Connais-tu le protocole d'échange avec ta bascule ? --> Voir notice du matériel/constructeur

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_mat1x Messages postés 8 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 2 février 2010
29 janv. 2010 à 09:42
Salut Jack
Merci pour l'erreur de synthaxe
J'ai renommée ma variable, mais malheureusement rien ne change,
Pour le protocole d'échange de la bascule, non je ne le connais pas, c un près d'une entreprise pour développer ce logiciel,Je n'est ni la niotice, ni la reference ni la marque, ni le constructeur , cette balance n'est pas toute jeune, la seul référence que j'ai est le dispositif d'affichage qui est un "indicateur programmable +/-10 000 points pour pont de jauges DIP206". je n'arrive pas a trouvez d'info sur le net.
Pour les caracteres reçus je ne sait pas vraiment, les deux trames que je doit envoyer sont en Hexa.

dans mon code j'ai effectuer quelque changement :
-changement du nom de la variable "texte" en "strTexteRecu"
- mise en place d'un timer

pour les ligne avec les invoke, il y en a deux une pour la fonction affichage et la deuxième pour le timer

    Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
        RS232.Read(trame, 0, nb_octet)
        strTexteRecu = System.Text.Encoding.ASCII.GetString(trame)
' soit cette  ligne  la 
        Me.Invoke(New _Affiche_reception(AddressOf affichage), strTexteRecu)
'ou celle ci
        Me.Invoke(New _Affiche_reception(AddressOf timer1_tick), strTexteRecu)
    End Sub

    Private Sub affichage(ByVal texte As String)
        lbl_poids.Text = strTexteRecu
    End Sub


    Private Sub timer1_tick() Handles Timer1.Tick
        Dim i As Integer
        intTime = 0
        intTime = intTime + 1
        Try
            If RS232.BytesToRead > 0 Then
                data = New [Byte](RS232.BytesToRead) {}
                RS232.Read(data, 0, data.Length)
                For i = 0 To data.Length - 2
                    If data(i) = 8 Then
                        data(i) = Replace(data(i), "8", "32")
                    End If
                    Txt_reçoi.AppendText(Chr(Hex(data(i))))
                Next i
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub


Merci
Mat1x
0
cs_mat1x Messages postés 8 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 2 février 2010
29 janv. 2010 à 09:47
RE
Juste un petit truck sur les trois lignes
   If data(i) = 8 Then
     data(i) = Replace(data(i), "8", "32")
   End If

elle sont pour traduire un "backspace" en "space" elle me servait pour une conversion de décimal vert du texte.
0
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
29 janv. 2010 à 11:49
Bonjour!
Je connais pas ta balance,
mais je te donne un peu de mon expérience

1- Est-ce que la balance est paramétré pour l'envoi des données sur le RS232 ? (c'est souvent pas le cas)

2 - Souvent, il faut une commande pour activer la lecture (et oui, et chaque constructeur n'a pas les mêmes commandes).
Et cette lecture à un protocole pour nous dire que la valeur actuel est stable ou pas (balance pas encore stabilisée)

- ou la balance envoi en permanence les données pour permettre de faire un afficheur externe (je préconise pas cette solution)

3 - connaitre le format de réception des chiffres (même remarque que la 2)

Tu vois, il faut vraiment une doc

ET APRES C'EST SIMPLE

'Envoi de la commande
Balance.WriteLine (BalanceCommande)
'une petite pause à déterminer en rapport à la balance
Pause(BalancePause)

'Pour ne pas attendre indéfiniment
Dim StartTime As Double = Microsoft.VisualBasic.DateAndTime.Timer + 2

Do: Application.DoEvents
  Buffer = Balance.ReadExisting()
Loop Until Buffer <> "" OrElse Microsoft.VisualBasic.DateAndTime.Timer > StartTime
                
Balance.Close()


'ensuite lecture des valeurs Buffer
0

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

Posez votre question
cs_mat1x Messages postés 8 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 2 février 2010
29 janv. 2010 à 14:48
Donc pour activer la lecture je doit envoyer deux trame successivement qui sont au format Hexadécimal, pour le moment l'entreprise qui emplois mon ma societer est déja équipé de différents types de balances qui sont équipé par un afficheur externe,c'est aussi le cas pour celle que j'ai en test, en l'occurence cette dernière est relié a un dispositif d'affichage "DIP206", et en gros l'application que je doit faire doit reproduire se que le "DIP206" affiche.
La balance communique avec le "DIP206" via une connexion RS485, pour relier se dispositif au PC j'utilise un convertisseur RS485 vers RS232, tout en gardant le "DIP206".




Le principe de l'évolution est beaucoup plus rapide en informatique que chez le bipède.
0
cs_mat1x Messages postés 8 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 2 février 2010
2 févr. 2010 à 10:05
j'avance a petit pas, le protocole et soit soit en hexadécimal soit en ASCII, mais dans mon timer j'effectue un test:
Try
            If RS232.BytesToRead > 0 Then
                data = New [Byte](RS232.BytesToRead) {}
                RS232.Read(data, 0, data.Length)
                For i = 0 To data.Length - 2
                    TextBox1.Text = Hex(Asc(data(i).ToString))
                Next i
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

mais le rs232.BytesToRead reste a zéro. donc je me penche sur ce problème voila si vous avez quelque idées merci de m'aider

Mat1x

Le principe de l'évolution est beaucoup plus rapide en informatique que chez le bipède.
0
cs_mat1x Messages postés 8 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 2 février 2010
2 févr. 2010 à 10:14
J'ai aussi essayer d'effectuer un dialiogue entre un hyperterminal est la balance, mais sa ne fonctionne pas je ne voit pas comment faire
voila


Mat1x

[i]Le principe de l'évolution est beaucoup plus rapide en informatique que chez le bipède.

/i
0