Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Citation de MCSilver
Salut C4rr3r4, en réponse à ton appel à l'aide pour transformer une chaîne de byte en string:
Disons que l'on veut lire le registre 400011 de l'équipement à l'adresse ModBus 9, il faut envoyer (en décimal et peut importe la méthode choisie pour l'envoyer sur le port):
9,3,0,10,0,1,CRC_Hi,CRC_Lo
Maintenant, pour arricher à obtenir cette chaîne de caractères dans une String:
Dim MyString as String
MyString=Chr(9) & Chr(3) & Chr(0) & Chr(10) & Chr(0) & Chr(1) & Chr(2) & Chr(CRC_Hi) & Chr(CRC_Lo)
*Sache que tu ne pourras valider le contenu de cette trame car étant une variable string, à l'affichage, VB essaiera d'afficher le caractère ASCII 0, qui n'est pas un caractère affichable, il le remplacera par un autre caractère genre "|"*
Pour obtenir une chaîne de Byte dans un tableau:
Dim MyArrByte(9) as Byte
MyArrByte(0)=9
MyArrByte(1)=3
....
MyArrByte(8)=CRCHi
MyArrByte(9)=CRCLo
Il y a une 3e méthode proposée par SerialPort.Write (Char,Int, Int). Ne l'utilise par c'est incompatible avec le ModBus (les paramètres de trame ne peuvent pas êtres signés (-1 à -127, ils doivent demeurer dans une plage positive 0 à 255).
Voilà, n'hésites pas si tu as d'autre Q. Bonne chance.
Private Sub send_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles send.Click Dim retour As String 'envoie de la trame serialport.Write(...) retour = serialport.ReadExisting log.Text += retour End Sub
Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialport.DataReceived 'lecture du buffer du port série Dim ByteArr(serialport.ReadBufferSize) As Byte Dim NbBytesRecu As Integer Dim i As Integer Dim BytesEnString As String = "" NbBytesRecu = Me.serialport.Read(ByteArr, 0, serialport.ReadBufferSize) For i = 0 To NbBytesRecu - 1 If ByteArr(i) < 16 Then BytesEnString += "0" & Hex(ByteArr(i)) & " " Else BytesEnString += Hex(ByteArr(i)) & " " End If Next SetText(vbCrLf & BytesEnString) End Sub Delegate Sub SetTextCallback(ByVal [text] As String) Private Sub SetText(ByVal [text] As String) If Me.log.InvokeRequired Then Dim d As New SetTextCallback(AddressOf SetText) Me.Invoke(d, New Object() {[text]}) Else Me.log.Text += [text] End If End Sub
1er envoie : 01 03 0B 30 00 01 86 21
1er retour : 01 03 0B 30 00 01 86 21 01 03 02 00 D1 78 18 (la réponse est bonne)
1er envoie : 01 03 0B 30 00 01 86 21
1er retour : 01 03 0B 30 00 01 86 21
2ème envoie : 01 06 00 07 00 80 39 AB (autre trame au hasard)
2ème retour : 01 03 02 00 D1 78 18(la réponse de la trame d'avant) 01 06 00 07 00 80 39 AB (début de la réponse du 2ème envoie, la fin sera émise au 3ème envoie et ainsi de suite)
serialport.Baudrate = 19200 serialport.databits = 8 serialport.dtrenable = true serialport.handshake = none serialport.parity = none serialport.readbuffersize = 4096 serialport.readtimeout = 2000 serialport.receivedbytes = 8 serialport.Rtsenable = true serialport.stopbit = one serialport.writebuffersize = 2048 serialport.writetimeout = 400
Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialport.DataReceived 'lecture du buffer du port série Dim ByteArr(serialport.ReadBufferSize) As Byte Dim NbBytesRecu As Integer Dim i As Integer Dim BytesEnString As String = "" MsgBox(serialport.ReadBufferSize) NbBytesRecu = Me.serialport.Read(ByteArr, 0, serialport.ReadBufferSize) For i = 0 To NbBytesRecu - 1 If ByteArr(i) < 16 Then BytesEnString += "0" & Hex(ByteArr(i)) & " " Else BytesEnString += Hex(ByteArr(i)) & " " End If Next SetText(vbCrLf & BytesEnString) End Sub Delegate Sub SetTextCallback(ByVal [text] As String) Private Sub SetText(ByVal [text] As String) If Me.log.InvokeRequired Then Dim d As New SetTextCallback(AddressOf SetText) Me.Invoke(d, New Object() {[text]}) Else Me.log.Text += [text] End If End Sub