Solución: Verificar que la balanza esté conectada y programar la función que obtenga el peso.
Primero, antes de ponerse a programar, estar totalmente seguros que existe conexión entre la balanza y la computadora, que la balanza esté enviando correctamente los datos, además de que la computadora los esté recibiendo.
Para ello se utiliza el programa Hyper Terminal, que suele venir en Windows XP.
En la pantalla del Hyper Terminal se puede ver que los datos de la balanza no son fijos, al menos en mi caso, sino que constantemente está enviando información si cesar, no solo del peso, sino de muchos datos adicionales.
En mi caso, la información está dividida por comas, que debo tener en cuenta al momento de programar.
Ya entrando de lleno a la programación, al cargar la aplicación, valido que el puerto esté abierto y que se esté recibiendo información de la balanza, ésto lo hago con el siguiente procedimiento.
Private Sub captura_puerto2() Dim num_puerto As Integer Dim returnStr As String = "" On Error GoTo fallo num_puerto = 1 'Variable global nombre_puerto = "COM" & num_puerto Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort(nombre_puerto) com1.DataBits = 8 com1.ReadTimeout = 3600 Dim Incoming As String = com1.ReadLine() returnStr = Incoming Thread.Sleep(100) Incoming = com1.ReadLine() com1.Close() End Using Exit Sub fallo: MsgBox(Err.Description, vbCritical) End Sub
Luego, para capturar el peso, el cual lo hago desde un grid, cuando presionan Enter, utilizo lo siguiente.
Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles DataGridView1.KeyDown If DataGridView1.CurrentCell.ColumnIndex = 1 Then 'Columna que se captura el peso DataGridView1.CurrentCell.Value = fp_captura_peso() End If End Sub Private Function fp_captura_peso() As Double Dim lnLen As Long Dim lnCRpos As Object Dim InBuffer As Object Dim InMiddle, InDistinct As Object Dim peso_final As Object = 0 Dim n As Long On Error GoTo fallo lcEntrada = " " fp_captura_peso = 0 Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort(nombre_puerto) Dim Incoming As String = com1.ReadLine() Thread.Sleep(100) Incoming = com1.ReadLine() lcEntrada = Incoming End Using If Len(Trim(lcEntrada)) > 10 Then Dim subStrings() As String Dim TestArray() As String = Split(lcEntrada, ",") For i As Integer = 0 To TestArray.Length - 1 If TestArray(i) <> "" Then If Char.IsNumber(Trim(TestArray(i))) = True Then peso_final = TestArray(i) End If End If Next If IsNumeric(peso_final) Then If peso_final >= 0 Then fp_captura_peso = Format(CDbl(peso_final), "###,##0.0000") Exit Function End If Else fp_captura_peso = 0 End If Else MsgBox("No se ha detectado peso, intente nuevamente...", vbCritical) End If Exit Function fallo: MsgBox(Err.Description) End Function
Para que funcione correctamente se debe importar la siguiente librería.
Imports MSCommLib