none
Conectar balanza a PC por puerto serie RS-232 en VB.NET RRS feed

  • Debate general

  • Hola,

    Tengo un balanza digital con salida RS-232, el fabricante me proporciona toda la información para lograr la comunicación.

    Para enviar datos, menciona este comando:

    'ENVIAR EL RESULTADO ESTABLE EN LA UNIDAD ACTUAL
    
    ''' <summary>Execute command: S  - Get the stable result in current unit.
    ''' </summary>
    ''' <param name="stream">Connection channel of weighing device.</param>
    ''' <returns>Return complex state result.</returns>
    
        Public Shared Function ExecuteCommand_SU(stream As Stream) As CMPCompletion
    
            Dim cmpCompletion As New CMPCompletion()
    
            Try
    
            'sending request command and wait for response
            'waiting 5s for stable weight
    
            cmpCompletion.RequestCommand = CMProtocolExecutor.EnsureCommandsCompletion("SU") 'Envío de solicitud de comando (Request Command)
            Dim str1 As String = CMProtocolExecutor.SendRequestWaitForResponse(stream, cmpCompletion.RequestCommand, "SU ", 1000)
    
            'exiting if response is not expected
    
            If String.IsNullOrEmpty(str1) Then
                Return cmpCompletion
            End If
    
            cmpCompletion.ResponseList.Add(str1)
    
            'getting response status
    
            cmpCompletion.ResponseLastState = CMPResponseHelper.GetResponseState(str1)
    
            'checking response status
    
            If cmpCompletion.ResponseLastState = CMPResponseState.Ok_A_StartAsync Then
    
                'waiting for the next response, witch long time e.g. 5 sec.
    
                str1 = CMProtocolExecutor.WaitForResponse(stream, 1000)
                cmpCompletion.ResponseList.Add(str1)
    
                'checking expected response syntax
    
                If Not CMProtocolExecutor.ResponseIsCommandOf(str1, "SU ") Then
                    Return cmpCompletion
                End If
    
                'new response state
    
                cmpCompletion.ResponseLastState = CMPResponseHelper.GetResponseState(str1)
            End If
    
            'checking response status
    
            If cmpCompletion.ResponseLastState <> CMPResponseState.OK Then
                Return cmpCompletion
            End If
    
            'Parsing response values
    
            Dim strArray As String() = str1.Split(New String(0) {" "}, StringSplitOptions.RemoveEmptyEntries)
    
            Dim PesoObtenido As Double = Double.Parse(strArray(1), DirectCast(CultureInfo.InvariantCulture, IFormatProvider))
            Dim UnidadObtenida As String = strArray(2)
    
            TextBox1.Text = CStr(PesoObtenido)
    
            Catch ex As Exception
            MessageBox.Show("no hay nada")
            cmpCompletion.[Error] = ex
            End Try
    
            'return summary result
    
            Return cmpCompletion
    
        End Function

    y para recibir los datos:

    Send The Stable Result in Current Unit

    Con esta información y la de comunicación (BaudRate, Paridad, Bits de parada, etc.)

    ¿Podrían por favor orientarme en cómo lograr recibir los pesos de la balanza en un textbox del formulario?.

    DESDE YA MUY AGRADECIDO POR LEER !

    domingo, 13 de agosto de 2017 17:09

Todas las respuestas

  • Hola:

    Mira la tabla ASCII en primero lugar para presentar el CR y LF.

    Aquí encuentras un documento para enviar datos al puerto serie con varios lenguajes de Visual Studio.

    Ver documento.

    Hay varias formas de enviar comandos al puerto serie como indica abajo, en tu caso Visual Basic .net.

    Private Sub button_t_Click(sender As Object, e As EventArgs)
    	Dim mBuffer As Byte() = New Byte(0) {}
    	mBuffer(0) = &H74
    	'ASCII letter "t".
    	serialPort1.Write(mBuffer, 0, mBuffer.Length)
    End Sub

    La forma más sencilla:

    Private Sub button_b_Click(sender As Object, e As EventArgs)
    	Dim mBuffer As Byte() = Encoding.ASCII.GetBytes("Hello World")
    	serialPort1.Write(mBuffer, 0, mBuffer.Length)
    End Sub

    La más laboriosa pero la más segura es esta.

    Private Sub button_t_Click(sender As Object, e As EventArgs)
    	Dim mBuffer As Byte() = New Byte(4) {}
    	mBuffer(0) = &H74
    	mBuffer(1) = &H75
    	mBuffer(2) = &H89
    	mBuffer(3) = &H20
    	mBuffer(4) = &H6c
    	serialPort1.Write(mBuffer, 0, mBuffer.Length)
    End Sub

    https://www.codeproject.com/Articles/46603/A-PicRS-control-with-a-PIC-microcontroller-seri

    La parte de recibir datos lo encuentras en el documento de abajo a partir de la página 50.

    Ver documento.

    Saludos.


    http://electronica-pic.blogspot.com


    • Editado Metaconta lunes, 14 de agosto de 2017 11:57
    lunes, 14 de agosto de 2017 11:53
  • Gracias por la respuesta, me ha sido muy útil.

    Ahora quedó bien claro como enviar datos, ¿pero para recibirlos teniendo en cuenta la tabla indicativa del fabricante?.

    Gracias de nuevo!

    martes, 15 de agosto de 2017 0:06
  • Hola:

    Antes que nada.

    1. ¿Estás trabajando en modo consola o modo formulario de Windows?

    2. ¿Puedes enseñar la tabla del fabricante para ver que datos recibe?

    Lo puedes saber en los documentos que te di arriba, ya que luego tienes que interpretarlos como quieras.

    Si es en modo consola debes tener este evento que detecta los bytes recibidos.

            ' Detecta cualquier dato recibido.
            AddHandler Puerto_serie.DataReceived, AddressOf DataReceivedHandler

    Aquí muestra los Bytes recibidos.

        Private Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
    
            Dim sp As SerialPort = DirectCast(sender, SerialPort)
            Dim entradaDatos As String = sp.ReadExisting() ' Almacena los datos recibidos en la variable tipo string.
    
            Console.WriteLine(Convert.ToString("Dato recibido desde Arduino: ") & entradaDatos) ' Muestra en pantalla los datos recibidos.
    
        End Sub

    Si tienes o sabes el modelo de la balanza para buscarlo por Interent avisa, quizás enceuntre un PDF o información más detallada.

    Saludos.


    http://electronica-pic.blogspot.com


    • Editado Metaconta martes, 15 de agosto de 2017 12:54
    martes, 15 de agosto de 2017 9:46
  • Gracias por toda la información. Finalmente pude resolver el problema.

    Aquí dejo la solución por si a otra persona re resulta útil:

    De acuerdo a la información aportada por el fabricante "Send The Stable Result in Current Units", la estructura de respuesta de la balanza es: S U _ _ _ + 1 2 3 4 5 . 6 7 8 _ g _ _ CR FT (el guión bajo representa un espacio: tecla Space, el + el signo de la medida, SU el comando de respuesta para éste dispositivo, g los gramos, CR FT, Retorno de Carro y Bajada de Linea y los números el peso de la balanza).

    "S U _ _ _ + 1 2 3 4 5 . 6 7 8 _ g _ _ CR FT" convertida en ASCII según tabla es: "53 55 20 20 2d 20 20 31 37 32 2e 31 33 35 20 4e 20 20 0D 0A" (por supuesto sin comillas, 0D sería CR y 0A=FT).

    Como desde la balanza recibimos en código ASCII, utilicé Encoding.UTF8.GetString() para traducir de bytes a String.

    Gracias y saludos!

    jueves, 17 de agosto de 2017 11:05
  • Gracias por toda la información. Finalmente pude resolver el problema.

    Aquí dejo la solución por si a otra persona re resulta útil:

    De acuerdo a la información aportada por el fabricante "Send The Stable Result in Current Units", la estructura de respuesta de la balanza es: S U _ _ _ + 1 2 3 4 5 . 6 7 8 _ g _ _ CR FT (el guión bajo representa un espacio: tecla Space, el + el signo de la medida, SU el comando de respuesta para éste dispositivo, g los gramos, CR FT, Retorno de Carro y Bajada de Linea y los números el peso de la balanza).

    "S U _ _ _ + 1 2 3 4 5 . 6 7 8 _ g _ _ CR FT" convertida en ASCII según tabla es: "53 55 20 20 2d 20 20 31 37 32 2e 31 33 35 20 4e 20 20 0D 0A" (por supuesto sin comillas, 0D sería CR y 0A=FT).

    Como desde la balanza recibimos en código ASCII, utilicé Encoding.UTF8.GetString() para traducir de bytes a String.

    Gracias y saludos!

    Hola:

    Muchas gracias por la explicación y felicidades de haberlo conseguido.

    Usas el UTF8. ¿Haz probado con ASCII?

    Quiero comprar una balanza como la tuya, que se puede hacer de todo.

    ¿Puedes decirme el modelo y marca de tu balanza digital?

    Muchas gracias.


    PD: Por cierto, pusiste FT cuando es LF nueva línea.



    • Editado Metaconta jueves, 17 de agosto de 2017 12:31
    jueves, 17 de agosto de 2017 12:27
  • Gracias por toda la información. Finalmente pude resolver el problema.

    Aquí dejo la solución por si a otra persona re resulta útil:

    De acuerdo a la información aportada por el fabricante "Send The Stable Result in Current Units", la estructura de respuesta de la balanza es: S U _ _ _ + 1 2 3 4 5 . 6 7 8 _ g _ _ CR FT (el guión bajo representa un espacio: tecla Space, el + el signo de la medida, SU el comando de respuesta para éste dispositivo, g los gramos, CR FT, Retorno de Carro y Bajada de Linea y los números el peso de la balanza).

    "S U _ _ _ + 1 2 3 4 5 . 6 7 8 _ g _ _ CR FT" convertida en ASCII según tabla es: "53 55 20 20 2d 20 20 31 37 32 2e 31 33 35 20 4e 20 20 0D 0A" (por supuesto sin comillas, 0D sería CR y 0A=FT).

    Como desde la balanza recibimos en código ASCII, utilicé Encoding.UTF8.GetString() para traducir de bytes a String.

    Gracias y saludos!

    Hola:

    Muchas gracias por la explicación y felicidades de haberlo conseguido.

    Usas el UTF8. ¿Haz probado con ASCII?

    Quiero comprar una balanza como la tuya, que se puede hacer de todo.

    ¿Puedes decirme el modelo y marca de tu balanza digital?

    Muchas gracias.


    PD: Por cierto, pusiste FT cuando es LF nueva línea.



    Hola,

    No he probado con ASCII,  UTF8 era la recomendada por el fabricante y usé esa.

    La balanza es una Balanza analítica (0,1 mg de precisión, resolución 0,01 mg), Marca RADWAG (polaca), Modelo: 220/60 R2. En la web se consiguen fácilmente manuales en español.

    Según tengo entendido, se puede usar el mismo código para cualquiera balanza Radwag.

    Saludos!

    viernes, 18 de agosto de 2017 0:06
  • Hola:

    Parece que es esta:

    http://radwag.com/en/as-60-220-r2-analytical-balance,w1,2EQ,101-101-107#1

    A partir de la página 80 de este manual en Inglés empieza a hablar del puerto serie y los comandos. No lo encuentro en español.

    Ver manual.

    ¿Puedes subir capturas de la interfaz y del código fuente de lo que haz hecho?

    Gracias campeón. ;)

    PD: Es verdad, el fabricante lo indica. Más información del enconding.


    http://electronica-pic.blogspot.com


    • Editado Metaconta sábado, 19 de agosto de 2017 0:05
    viernes, 18 de agosto de 2017 23:28
  • Hola:

    Parece que es esta:

    http://radwag.com/en/as-60-220-r2-analytical-balance,w1,2EQ,101-101-107#1

    A partir de la página 80 de este manual en Inglés empieza a hablar del puerto serie y los comandos. No lo encuentro en español.

    Ver manual.

    ¿Puedes subir capturas de la interfaz y del código fuente de lo que haz hecho?

    Gracias campeón. ;)

    PD: Es verdad, el fabricante lo indica. Más información del enconding.


    http://electronica-pic.blogspot.com


    Hola, es exactamente esa la balanza. La recomiendo.

    Dejo el código completo, así se puede copiar y pegar para el que lo necesita.

    Imports System.Diagnostics
    Imports System.Globalization
    Imports System.IO
    Imports System.Text


    FUNCIÓN EXECUTECOMAND_SU, QUE ENVÍA LA SOLICITUD Y AGUARDA ESTABILIDAD DE LA BALANZA:

       Public Shared Function ExecuteCommand_SU(stream As Stream) As CMPCompletion
    
            Dim cmpCompletion As New CMPCompletion()
    
            Try
                cmpCompletion.RequestCommand = EnsureCommandsCompletion("SU") 'ENVÍO DE SOLICITUD DE COMANDO
    
                Dim str1 As String = SendRequestWaitForResponse(stream, cmpCompletion.RequestCommand, "SU ", CInt(Comunicacion.TiempoEstab.Text)) '5 SEGUNDOS
    
                If String.IsNullOrEmpty(str1) Then
                    Return cmpCompletion
                End If
    
                cmpCompletion.ResponseList.Add(str1)
                cmpCompletion.ResponseLastState = CMPResponseHelper.GetResponseState(str1)
    
                If cmpCompletion.ResponseLastState = cmpCompletion.CMPResponseState.Ok_A_StartAsync Then
                    str1 = CMProtocolExecutor.WaitForResponse(stream, CInt(Comunicacion.TiempoEstab.Text))
                    cmpCompletion.ResponseList.Add(str1)
                    If Not CMProtocolExecutor.ResponseIsCommandOf(str1, "SU ") Then
                        Return cmpCompletion
                    End If
                    cmpCompletion.ResponseLastState = CMPResponseHelper.GetResponseState(str1)
                End If
                If cmpCompletion.ResponseLastState <> cmpCompletion.CMPResponseState.OK Then
                    Return cmpCompletion
                End If
    
                Dim strArray As String() = str1.Split(New String(0) {" "}, StringSplitOptions.RemoveEmptyEntries)
                Double.Parse(strArray(1), DirectCast(CultureInfo.InvariantCulture, IFormatProvider))
                Dim str2 As String = strArray(2) 'UNIDAD
    
            Catch ex As Exception
                cmpCompletion.[Error] = ex
            End Try
    
            Return cmpCompletion
    
        End Function


        Public Shared Function SendRequestWaitForResponse(stream As Stream, requestCommand As String, _
                                                          Optional waitingCommandID As String = Nothing, _
                                                          Optional millisecondsTimeout As Integer = 1000) As String
            Dim buffer As Byte() = BuildBinaryPacket(requestCommand)
            stream.Write(buffer, 0, buffer.Length)
            Dim packet As String = WaitForResponse(stream, millisecondsTimeout)
            If String.IsNullOrEmpty(waitingCommandID) OrElse CMProtocolExecutor.ResponseIsCommandOf(packet, waitingCommandID) Then
                Return packet
            End If
            Return DirectCast(Nothing, String)
        End Function


        Public Shared Function ResponseIsCommandOf(packet As String, command As String) As Boolean
            Return packet.StartsWith(command, StringComparison.InvariantCultureIgnoreCase)
        End Function


        Public Shared Function WaitForResponse(stream As Stream, Optional millisecondsTimeout As Integer = 1000) As String
            stream.ReadTimeout = CInt(millisecondsTimeout)
            Dim buffer As Byte() = New Byte(1023) {}
            Dim flag As Boolean = False
            Using memoryStream As New MemoryStream()
                Dim stopwatch As New Stopwatch()
                stopwatch.Start()
                Do
                    Dim count As Integer = stream.Read(buffer, 0, buffer.Length)
                    For index As Integer = 0 To count - 1
                        If flag Then
                            If CInt(buffer(index)) = 10 Then
                                memoryStream.Write(buffer, 0, index + 1)
                                Return Encoding.UTF8.GetString(memoryStream.ToArray())
                            End If
                            flag = CInt(buffer(index)) = 13
                        ElseIf CInt(buffer(index)) = 13 Then
                            flag = True
                        End If
                    Next
                    memoryStream.Write(buffer, 0, count)
                Loop While stopwatch.ElapsedMilliseconds < CLng(millisecondsTimeout)
            End Using
            Throw New TimeoutException("Read timeout elapsed")
        End Function


        Public Shared Function BuildBinaryPacket(command As String) As Byte()
            command = EnsureCommandsCompletion(command)
            Return Encoding.UTF8.GetBytes(command)
        End Function

        Public Shared Function EnsureCommandsCompletion(command As String) As String
            If Not command.EndsWith(vbCrLf) Then
                command += vbCrLf
            End If
            Return command
        End Function


    Public Class CMPCompletion
    
        Public ResponseList As New List(Of String)()
        Public ResponseLastState As CMPResponseState = CMPResponseState.UnknownState
        Public RequestCommand As String
        Public [Error] As Exception
    
        Public ReadOnly Property IsResponseOK() As Boolean
            Get
                Return Me.ResponseLastState = CMPResponseState.OK OrElse Me.ResponseLastState = CMPResponseState.Ok_D_EndAsync
            End Get
        End Property
    
        'REFERENCIAS OBTENIDAS DEL MANUAL DE LA BALANZA, PÁGINA 146.
        Public Enum CMPResponseState
            UnknownState = -255                 'ESTADO DESCONOCIDO
            Err_E_AwaitStabilityTimeout = -5    'LÍMITE DE TIEMPO SUPERADO, EN ESPERA DEL RESULTADO DE LA ESTABILIDAD
            Err_ES_UnknownCommand = -4          'COMANDO NO ENTENDIDO
            Err_RangeBelow = -3                 'COMANDO ENTENDIDO, PERO SE HA SUPERADO EL RANGO DE TARA
            Err_RangeOverflow = -2              'COMANDO ENTENDIDO, PERO SE HA SUPERADO EL RANGO DE PUESTA A 0
            Err_I_CannotExecuteNow = -1
            OK = 0                              'COMANDO REALIZADO
            Ok_A_StartAsync = 1                 'COMANDO ENTENDIDO, COMENZÓ A REALIZAR
            Ok_D_EndAsync = 2                   'COMANDO TERMINADO
        End Enum
    
    End Class


    Public NotInheritable Class CMPResponseHelper
        Private Sub New()
        End Sub
        Public Const EndOfPacket As String = vbCrLf
        Public Const ResponseState_OK As String = " OK" & vbCrLf
        Public Const ResponseState_A As String = " A" & vbCrLf
        Public Const ResponseState_D As String = " D" & vbCrLf
        Public Const ResponseState_I As String = " I" & vbCrLf
        Public Const ResponseState_UP As String = "^"
        Public Const ResponseState_DOWN As String = "v"
        Public Const ResponseState_ES As String = "ES" & vbCrLf
        Public Const ResponseState_E As String = " E" & vbCrLf
    
        Public Shared Function GetResponseState(response As String) As CMPCompletion.CMPResponseState
            If response Is Nothing Then
                Throw New ArgumentNullException("response")
            End If
            If response.LastIndexOf(" OK" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.OK
            End If
            If response.LastIndexOf(" A" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.Ok_A_StartAsync
            End If
            If response.LastIndexOf(" D" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.Ok_D_EndAsync
            End If
            If response.LastIndexOf(" I" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.Err_I_CannotExecuteNow
            End If
            If response.IndexOf("^") > -1 Then
                Return CMPCompletion.CMPResponseState.Err_RangeOverflow
            End If
            If response.IndexOf("v") > -1 Then
                Return CMPCompletion.CMPResponseState.Err_RangeBelow
            End If
            If response.LastIndexOf("ES" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.Err_ES_UnknownCommand
            End If
            Return If(response.LastIndexOf(" E" & vbCrLf) > -1, CMPCompletion.CMPResponseState.Err_E_AwaitStabilityTimeout, CMPCompletion.CMPResponseState.OK)
        End Function
    End Class

    LA INTERFAZ ES SIMPLE, SÓLO CONECTANDO CON UN CABLE USB DESDE LA BALANZA A LA PC.

    PARA QUE RECONOZCA LOS COM, HAY QUE INSTALAR EL DRIVER PROVISTO POR EL FABRICANTE.

    LO IMPORTANTE ES QUE DENTRO DE LA FUNCIÓN EXECUTECOMAND_SU, PODEMOS ENVIAR EL RESULTADO (PESAJE DE LA BALANZA) A UN TEXTBOX POR EJEMPLO DE LA SIGUIENTE MANERA:

    Me.TextBox1.Text=strArray(1)

    SI NECESITAMOS LA UNIDAD:

    Me.TextBox1.Text=str2

    EL PROGRAMA ANDA BIEN.

    IMPORTANTE: PARA NO ANDAR PROBANDO CÓDIGOS CON LA BALANZA, SE PUEDE USAR EL EMULADOR DE PUERTOS VSPE Y LUEGO EL SOFT HERCULES, DE LA EMPRESA HW-GROUP PARA ENVIAR LA INFOMACIÓN EN HEXADECIMAL.

    SALUDOS !

    MANUAL EN ESPAÑOL BALANZA RADWAG 60/220.R2

    sábado, 19 de agosto de 2017 0:29
  • Hola:

    Parece que es esta:

    http://radwag.com/en/as-60-220-r2-analytical-balance,w1,2EQ,101-101-107#1

    A partir de la página 80 de este manual en Inglés empieza a hablar del puerto serie y los comandos. No lo encuentro en español.

    Ver manual.

    ¿Puedes subir capturas de la interfaz y del código fuente de lo que haz hecho?

    Gracias campeón. ;)

    PD: Es verdad, el fabricante lo indica. Más información del enconding.


    http://electronica-pic.blogspot.com


    Hola, es exactamente esa la balanza. La recomiendo.

    Dejo el código completo, así se puede copiar y pegar para el que lo necesita.

    Imports System.Diagnostics
    Imports System.Globalization
    Imports System.IO
    Imports System.Text


    FUNCIÓN EXECUTECOMAND_SU, QUE ENVÍA LA SOLICITUD Y AGUARDA ESTABILIDAD DE LA BALANZA:

       Public Shared Function ExecuteCommand_SU(stream As Stream) As CMPCompletion
    
            Dim cmpCompletion As New CMPCompletion()
    
            Try
                cmpCompletion.RequestCommand = EnsureCommandsCompletion("SU") 'ENVÍO DE SOLICITUD DE COMANDO
    
                Dim str1 As String = SendRequestWaitForResponse(stream, cmpCompletion.RequestCommand, "SU ", CInt(Comunicacion.TiempoEstab.Text)) '5 SEGUNDOS
    
                If String.IsNullOrEmpty(str1) Then
                    Return cmpCompletion
                End If
    
                cmpCompletion.ResponseList.Add(str1)
                cmpCompletion.ResponseLastState = CMPResponseHelper.GetResponseState(str1)
    
                If cmpCompletion.ResponseLastState = cmpCompletion.CMPResponseState.Ok_A_StartAsync Then
                    str1 = CMProtocolExecutor.WaitForResponse(stream, CInt(Comunicacion.TiempoEstab.Text))
                    cmpCompletion.ResponseList.Add(str1)
                    If Not CMProtocolExecutor.ResponseIsCommandOf(str1, "SU ") Then
                        Return cmpCompletion
                    End If
                    cmpCompletion.ResponseLastState = CMPResponseHelper.GetResponseState(str1)
                End If
                If cmpCompletion.ResponseLastState <> cmpCompletion.CMPResponseState.OK Then
                    Return cmpCompletion
                End If
    
                Dim strArray As String() = str1.Split(New String(0) {" "}, StringSplitOptions.RemoveEmptyEntries)
                Double.Parse(strArray(1), DirectCast(CultureInfo.InvariantCulture, IFormatProvider))
                Dim str2 As String = strArray(2) 'UNIDAD
    
            Catch ex As Exception
                cmpCompletion.[Error] = ex
            End Try
    
            Return cmpCompletion
    
        End Function


        Public Shared Function SendRequestWaitForResponse(stream As Stream, requestCommand As String, _
                                                          Optional waitingCommandID As String = Nothing, _
                                                          Optional millisecondsTimeout As Integer = 1000) As String
            Dim buffer As Byte() = BuildBinaryPacket(requestCommand)
            stream.Write(buffer, 0, buffer.Length)
            Dim packet As String = WaitForResponse(stream, millisecondsTimeout)
            If String.IsNullOrEmpty(waitingCommandID) OrElse CMProtocolExecutor.ResponseIsCommandOf(packet, waitingCommandID) Then
                Return packet
            End If
            Return DirectCast(Nothing, String)
        End Function


        Public Shared Function ResponseIsCommandOf(packet As String, command As String) As Boolean
            Return packet.StartsWith(command, StringComparison.InvariantCultureIgnoreCase)
        End Function


        Public Shared Function WaitForResponse(stream As Stream, Optional millisecondsTimeout As Integer = 1000) As String
            stream.ReadTimeout = CInt(millisecondsTimeout)
            Dim buffer As Byte() = New Byte(1023) {}
            Dim flag As Boolean = False
            Using memoryStream As New MemoryStream()
                Dim stopwatch As New Stopwatch()
                stopwatch.Start()
                Do
                    Dim count As Integer = stream.Read(buffer, 0, buffer.Length)
                    For index As Integer = 0 To count - 1
                        If flag Then
                            If CInt(buffer(index)) = 10 Then
                                memoryStream.Write(buffer, 0, index + 1)
                                Return Encoding.UTF8.GetString(memoryStream.ToArray())
                            End If
                            flag = CInt(buffer(index)) = 13
                        ElseIf CInt(buffer(index)) = 13 Then
                            flag = True
                        End If
                    Next
                    memoryStream.Write(buffer, 0, count)
                Loop While stopwatch.ElapsedMilliseconds < CLng(millisecondsTimeout)
            End Using
            Throw New TimeoutException("Read timeout elapsed")
        End Function


        Public Shared Function BuildBinaryPacket(command As String) As Byte()
            command = EnsureCommandsCompletion(command)
            Return Encoding.UTF8.GetBytes(command)
        End Function

        Public Shared Function EnsureCommandsCompletion(command As String) As String
            If Not command.EndsWith(vbCrLf) Then
                command += vbCrLf
            End If
            Return command
        End Function


    Public Class CMPCompletion
    
        Public ResponseList As New List(Of String)()
        Public ResponseLastState As CMPResponseState = CMPResponseState.UnknownState
        Public RequestCommand As String
        Public [Error] As Exception
    
        Public ReadOnly Property IsResponseOK() As Boolean
            Get
                Return Me.ResponseLastState = CMPResponseState.OK OrElse Me.ResponseLastState = CMPResponseState.Ok_D_EndAsync
            End Get
        End Property
    
        'REFERENCIAS OBTENIDAS DEL MANUAL DE LA BALANZA, PÁGINA 146.
        Public Enum CMPResponseState
            UnknownState = -255                 'ESTADO DESCONOCIDO
            Err_E_AwaitStabilityTimeout = -5    'LÍMITE DE TIEMPO SUPERADO, EN ESPERA DEL RESULTADO DE LA ESTABILIDAD
            Err_ES_UnknownCommand = -4          'COMANDO NO ENTENDIDO
            Err_RangeBelow = -3                 'COMANDO ENTENDIDO, PERO SE HA SUPERADO EL RANGO DE TARA
            Err_RangeOverflow = -2              'COMANDO ENTENDIDO, PERO SE HA SUPERADO EL RANGO DE PUESTA A 0
            Err_I_CannotExecuteNow = -1
            OK = 0                              'COMANDO REALIZADO
            Ok_A_StartAsync = 1                 'COMANDO ENTENDIDO, COMENZÓ A REALIZAR
            Ok_D_EndAsync = 2                   'COMANDO TERMINADO
        End Enum
    
    End Class


    Public NotInheritable Class CMPResponseHelper
        Private Sub New()
        End Sub
        Public Const EndOfPacket As String = vbCrLf
        Public Const ResponseState_OK As String = " OK" & vbCrLf
        Public Const ResponseState_A As String = " A" & vbCrLf
        Public Const ResponseState_D As String = " D" & vbCrLf
        Public Const ResponseState_I As String = " I" & vbCrLf
        Public Const ResponseState_UP As String = "^"
        Public Const ResponseState_DOWN As String = "v"
        Public Const ResponseState_ES As String = "ES" & vbCrLf
        Public Const ResponseState_E As String = " E" & vbCrLf
    
        Public Shared Function GetResponseState(response As String) As CMPCompletion.CMPResponseState
            If response Is Nothing Then
                Throw New ArgumentNullException("response")
            End If
            If response.LastIndexOf(" OK" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.OK
            End If
            If response.LastIndexOf(" A" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.Ok_A_StartAsync
            End If
            If response.LastIndexOf(" D" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.Ok_D_EndAsync
            End If
            If response.LastIndexOf(" I" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.Err_I_CannotExecuteNow
            End If
            If response.IndexOf("^") > -1 Then
                Return CMPCompletion.CMPResponseState.Err_RangeOverflow
            End If
            If response.IndexOf("v") > -1 Then
                Return CMPCompletion.CMPResponseState.Err_RangeBelow
            End If
            If response.LastIndexOf("ES" & vbCrLf) > -1 Then
                Return CMPCompletion.CMPResponseState.Err_ES_UnknownCommand
            End If
            Return If(response.LastIndexOf(" E" & vbCrLf) > -1, CMPCompletion.CMPResponseState.Err_E_AwaitStabilityTimeout, CMPCompletion.CMPResponseState.OK)
        End Function
    End Class

    LA INTERFAZ ES SIMPLE, SÓLO CONECTANDO CON UN CABLE USB DESDE LA BALANZA A LA PC.

    PARA QUE RECONOZCA LOS COM, HAY QUE INSTALAR EL DRIVER PROVISTO POR EL FABRICANTE.

    LO IMPORTANTE ES QUE DENTRO DE LA FUNCIÓN EXECUTECOMAND_SU, PODEMOS ENVIAR EL RESULTADO (PESAJE DE LA BALANZA) A UN TEXTBOX POR EJEMPLO DE LA SIGUIENTE MANERA:

    Me.TextBox1.Text=strArray(1)

    SI NECESITAMOS LA UNIDAD:

    Me.TextBox1.Text=str2

    EL PROGRAMA ANDA BIEN.

    IMPORTANTE: PARA NO ANDAR PROBANDO CÓDIGOS CON LA BALANZA, SE PUEDE USAR EL EMULADOR DE PUERTOS VSPE Y LUEGO EL SOFT HERCULES, DE LA EMPRESA HW-GROUP PARA ENVIAR LA INFOMACIÓN EN HEXADECIMAL.

    SALUDOS !

    MANUAL EN ESPAÑOL BALANZA RADWAG 60/220.R2

    Hola:

    Te haz pegado un curro grande. Buen trabajo y gracias por compartir.

    Por fin en español el manual. ;)

    Cada vez veo mucho por aquí programando balanzas. ¿Los fabricantes están haciendo esto para vender más?

    Ya que ven a muchos tocando balanzas con Arduino, PIC o Visual Studio.

    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 19 de agosto de 2017 15:03
  • Hola, necesito hacer algo parecido para una balanza de diferente marca

    He copiado este codidogo pero parece que falta algo. Me da este error:

    OrElse CMProtocolExecutor.ResponseIsCommandOf(packet, waitingCommandID) Then

    y en este

    str1 = CMProtocolExecutor.WaitForResponse(stream, CInt(Comunicacion.TiempoEstab.Text))
                    cmpCompletion.ResponseList.Add(str1)
                    If Not CMProtocolExecutor.ResponseIsCommandOf(str1, "SU ") Then
                        Return cmpCompletion
                    End If

    En este el error da en "CMProtocolExecutor" y en "Comunicacion"

    Los errores son de uqe no existen las funciones

    Me pueden ayudar? Realmente lo necesito. 

    Gracias

    viernes, 9 de agosto de 2019 21:11
  • Hola, necesito hacer algo parecido para una balanza de diferente marca

    He copiado este codidogo pero parece que falta algo. Me da este error:

    OrElse CMProtocolExecutor.ResponseIsCommandOf(packet, waitingCommandID) Then

    y en este

    str1 = CMProtocolExecutor.WaitForResponse(stream, CInt(Comunicacion.TiempoEstab.Text))
                    cmpCompletion.ResponseList.Add(str1)
                    If Not CMProtocolExecutor.ResponseIsCommandOf(str1, "SU ") Then
                        Return cmpCompletion
                    End If

    En este el error da en "CMProtocolExecutor" y en "Comunicacion"

    Los errores son de uqe no existen las funciones

    Me pueden ayudar? Realmente lo necesito. 

    Gracias

    viernes, 9 de agosto de 2019 21:12