Programación General > Visual Basic 6.0 e inferiores

 Transmision Serie

(1/2) > >>

hanna:
he hecho una conexion serie entre un microcontrolador de motorola y visual basic pero los datos recibidos por el puerto serie de la maquina una vez en basic son interpretados en ascii HAY ALGUNA FORMA DE RECIBIRLOS EN HAXADECIMAL O BINARIO U OTROS ???????????????????????????

DrakerDG:
Si el control que utilizas es el que aparece en esta imagen:



Lo que tienes que cambiar es la propiedad ImputMode del control de valor 0 (0 - comInputModeText) a 1 (1 - comInputModeBinary), y listo ya tienes los datos byte por byte en en numeros binarios.

Toph:

--- Cita de: "DrakerDG" ---Lo que tienes que cambiar es la propiedad ImputMode del control de valor 0 (0 - comInputModeText) a 1 (1 - comInputModeBinary), y listo ya tienes los datos byte por byte en en numeros binarios.
--- Fin de la cita ---
Hola DrakerDG segun esta pagina http://w3.itchihuahua.edu.mx/~udavila/serie.html
las propiedades de InputMode: Elige qué tipo de datos manejará MSCOMM. Si InputMode vale 0 (la constante comInputModeText), se reciben sólo caracteres imprimibles. Si InputMode vale 1 (comInputModeBinary), habilito recibir caracteres no imprimibles o sea siempre se recibiran en ASCII.
he probado cambiando esto en mi programa y sigo obteniendo en ascii, espero hanna pueda comprobar esto u obtener resultados favorables para saber si me equivo  :huh:


--- Cita de: "hanna" ---HAY ALGUNA FORMA DE RECIBIRLOS EN HAXADECIMAL O BINARIO U OTROS ???????????????????????????
--- Fin de la cita ---
asi que la unica solucion que encontre es convertirlos despues de recibidos, cualquier cosa por ahi tengo las rutinas



saludos a ambos :hola:

DrakerDG:

--- Citar ---Si InputMode vale 1 (comInputModeBinary), habilito recibir caracteres no imprimibles o sea siempre se recibiran en ASCII.
--- Fin de la cita ---

En este caso hay una mala interpretacion. En el puerto serial recibes bytes y cada uno de estos puede tener un valor entre 0 y 255 (256 valores posibles).  Cuando tu control serial esta en valor 0, interpreta estos valores directamente a codigo ASCII, en este caso los valores son preinterpretados, por ejemplo si ingresa un codigo 00001101 (13 decimal) en ASCII es un Enter, 00100000 (32 decimal) un espacio en blanco, etc.  En el caso de configurar ImputMode a 1, no existe una pre-interpretacion, recibes el número binario tal cual es.  Lo que no puede hacer es asignar estos valores a un Label o Texto directamente pues estos controles interpretan automaticamente cualquier byte a ASCII, hay que tratarlos a nivel de variables unicamente.

Aquí incluyo una rutina que tengo para leer el puerto serial por medio de un control (name = comX), del cual leo los datos que me envía un osciloscopio, y dependiendo del codigo del byte ejecuto el programa correspondiente.


--- Código: Text ---Public Sub COM_IN()Dim Buffer As StringDim lBuf As IntegerDim cCH As IntegerDim cBT As ByteDim cBX As ByteDim sBX As StringWith frmOscIf CRdy Then    Buffer = .comX.InputElse    Buffer = ""End IflBuf = LenB(Buffer)For cCH = 1 To lBuf    cBT = AscB(MidB(Buffer, cCH, 1))    Xo = Xo + 1    If cBT = 127 Then        Xo = 0        If SetV.DATb(0) Then            For cBX = 0 To 127                SetV.DATb(cBX + 5) = True            Next            SetV.DATb(133) = True            SetV.DATb(0) = False        End If    End If    If cBT = 126 Then        Xo = 0        .lblW.Visible = True    Else        .lblW.Visible = False    End If    If (Xo > 0) And (Xo < 138) Then        If (cBT <> SetV.DATx(Xo)) Or SetV.DATb(Xo) Then            Select Case Xo                Case 1  'Volts per division                    cBX = (cBT And 12)                    Select Case cBX                        Case 0                            sBX = IIf(.TB.Buttons(8).Value, " 0.25 V/div", " 1 V")                            DVM(2) = "."                            DVM(4) = ""                            DVM(6) = ""                            SetV.VxDv = 1                        Case 4                            sBX = IIf(.TB.Buttons(8).Value, " 2.5 V/div", " 10 V")                            DVM(2) = ""                            DVM(4) = "."                            DVM(6) = ""                            SetV.VxDv = 10                        Case 8                            sBX = IIf(.TB.Buttons(8).Value, " 25 V/div", " 100 V")                            DVM(2) = ""                            DVM(4) = ""                            DVM(6) = "."                            SetV.VxDv = 100                    End Select                    .lcdE(3).Text = sBX                    cBX = (cBT And 48)                    Select Case cBX                        Case 0                            .lcdE(2).Text = " GROUND"                            .lcdE(2).CharColor = &HFF&                            DVM(7) = " GND"                        Case 16                            .lcdE(2).Text = " AC"                            .lcdE(2).CharColor = &H666A51                            DVM(7) = " VAC"                        Case 32                            .lcdE(2).Text = " DC"                            .lcdE(2).CharColor = &H666A51                            DVM(7) = " VDC"                    End Select'                    Beep                Case 2  'Time / Frec per division                    Select Case cBT                        Case 0                            sBX = IIf(.TB.Buttons(8).Value, " 0.5 µs/div 20MS", " 50 ns 20MS")                            SetV.TxDv = 5                        Case 1                            sBX = IIf(.TB.Buttons(8).Value, " 1 µs/div 10MS", " 100 ns 10MS")                            SetV.TxDv = 10                        Case 2                            sBX = IIf(.TB.Buttons(8).Value, " 5 µs/div 2MS", " 0.5 µs 2MS")                            SetV.TxDv = 50                        Case 3                            sBX = IIf(.TB.Buttons(8).Value, " 10 µs/div 1MS", " 1 µs 1MS")                            SetV.TxDv = 100                        Case 4                            sBX = IIf(.TB.Buttons(8).Value, " 50 µs/div 200KS", " 5 µs 200KS")                            SetV.TxDv = 500                        Case 5                            sBX = IIf(.TB.Buttons(8).Value, " 100 µs/div 100KS", " 10 µs 100KS")                            SetV.TxDv = 1000                        Case 6                            sBX = IIf(.TB.Buttons(8).Value, " 0.5 ms/div 20KS", " 50 µs 20KS")                            SetV.TxDv = 5                        Case 7                            sBX = IIf(.TB.Buttons(8).Value, " 1 ms/div 10KS", " 0.1 ms 10KS")                            SetV.TxDv = 10                        Case 8                            sBX = IIf(.TB.Buttons(8).Value, " 5 ms/div 2KS", " 0.5 ms 2KS")                            SetV.TxDv = 50                        Case 9                            sBX = IIf(.TB.Buttons(8).Value, " 10 ms/div 1KS", " 1 ms 1KS")                            SetV.TxDv = 100                    End Select                    .lcdE(0).Text = sBX                    If cBT < 6 Then                        SetV.Tdim = IIf(.TB.Buttons(14).Value, "MHz", "µs")                    Else                        SetV.Tdim = IIf(.TB.Buttons(14).Value, "KHz", "ms")                    End If                Case 3  'Trigger status                    cBX = (cBT And 120)                    If (cBT And 1) = 1 Then                        sBX = "SINGLE"                    Else                        sBX = "RUN"                    End If                    Select Case cBX                        Case 0                            sBX = " AUTO"                        Case 8                            sBX = " -EXTERN/" + sBX                        Case 16                            sBX = " +EXTERN/" + sBX                        Case 32                            sBX = " -INTERN/" + sBX                        Case 64                            sBX = " +INTERN/" + sBX                    End Select                    .lcdE(1).Text = sBX'                    Beep                Case 4  'Triger level                    Select Case cBT                        Case 0                            SetV.Tlev = 1                        Case 2                            SetV.Tlev = 6                        Case 4                            SetV.Tlev = 5                        Case 8                            SetV.Tlev = 4                        Case 16                            SetV.Tlev = 3                        Case 32                            SetV.Tlev = 2                    End Select'                    Beep                Case 5  'Signal info.                    .Dt(Xo - 5).Y1 = .SCR.Top + .SCR.Height - cBT * SV                    If SetV.DATb(Xo) Then                        .Dc(Xo - 5).Y1 = .Dt(Xo - 5).Y1                        .Dc(Xo - 5).Visible = .TB.Buttons(13).Value                        SetV.DATc(Xo) = cBT                        SetV.DATb(Xo) = False                    End If                Case 6 To 132  'Signal info                    .Dt(Xo - 6).Y2 = .SCR.Top + .SCR.Height - cBT * SV                    .Dt(Xo - 5).Y1 = .SCR.Top + .SCR.Height - cBT * SV                    If SetV.DATb(Xo) Then                        .Dc(Xo - 6).Y2 = .Dt(Xo - 6).Y2                        .Dc(Xo - 5).Y1 = .Dt(Xo - 5).Y1                        .Dc(Xo - 5).Visible = .TB.Buttons(13).Value                        SetV.DATc(Xo) = cBT                    End If                Case 133 'Signal info.                    .Dt(Xo - 6).Y2 = .SCR.Top + .SCR.Height - cBT * SV                    If SetV.DATb(Xo) Then                        .Dc(Xo - 6).Y2 = .Dt(Xo - 6).Y2                        SetV.DATc(Xo) = cBT                    End If                Case 134   'Hundred DVM                    DVM(1) = Trim(Str(cBT))                Case 135    'Ten DVM                    DVM(3) = Trim(Str(cBT))                Case 136    'Unit DVM                    DVM(5) = Trim(Str(cBT))                Case 137    'Negative Voltage.                    If (cBT And 8) = 8 Then                        DVM(0) = "-"                    Else                        DVM(0) = "+"                    End If                    If (cBT And 3) > 0 Then                        If (cBT And 8) = 8 Then                            DVM(8) = "<"                        Else                            DVM(8) = ">"                        End If                        Beep                    Else                        DVM(8) = ""                    End If            End Select            DVMtx = " " & DVM(0) & DVM(1) & DVM(2) & DVM(3) & DVM(4) & DVM(5) & DVM(6) & DVM(7)            If .lcdE(6).Text <> DVMtx Then                .lcdE(6).Text = DVMtx            End If            If SetV.DATx(Xo) <> cBT Then                SetV.DATx(Xo) = cBT            End If            If SetV.DATb(Xo) Then                SetV.DATb(Xo) = False            End If        End If    End IfNextEnd With End Sub 
El buffer del serial se guarda en una variable tipo string. La clave de extraer cada byte del buffer es la funcion AscB() como byte.


--- Citar ---Asc (Función)
     

Devuelve un tipoInteger que representa elcódigo de carácter correspondiente a la primera letra de una cadena.

Sintaxis

Asc(cadena)

Elargumento obligatorio cadena es unaexpresión de cadena válida. Si cadena no contiene caracteres, se produce unerror en tiempo de ejecución.

Comentarios

El intervalo del valor de retorno es entre 0 y 255 en sistemas que no sean DBCS, y entre –32768 y 32767 en sistemasDBCS.

Nota   La función AscB se utiliza con bytes de datos contenidos en una cadena. En lugar de devolver el código de carácter para el primer carácter, AscB devuelve el primer byte. La función AscW siempre devuelve el código de carácterUnicode en plataformas donde no se admite Unicode, en cuyo caso, el comportamiento es idéntico al de la función Asc.
--- Fin de la cita ---

Otra funcion importante es LenB(), ya que la funcion Len() pre-interpreta el codigo, y no toma el cuenta los carateres no imprimibles, por lo que daría un numero menor.


--- Citar ---Len (Función)
     

Devuelve un tipoLong que contiene el número de caracteres en una cadena o el número de bytes necesarios para almacenar unavariable.

Sintaxis

Len(cadena | nombrevar)

La sintaxis de la función Len consta de las siguientes partes:

Parte Descripción
cadena Cualquierexpresión de cadena válida. Si cadena contieneNull, se devuelve Null.
Nombrevar Cualquier nombre devariable válido. Si nombrevar contiene Null, se devuelve Null. Si nombrevar es un tipoVariant, Len actúa igual que con un tipo String y siempre devuelve el número de caracteres que contiene.


Comentarios

Se deben especificar uno (y sólo uno) de los dosargumentos posibles. Contipos definidos por el usuario, Len devuelve el tamaño como se escribirá en el archivo.

Nota   Utilice la función LenB con datos de byte incluidos en una cadena, como en los lenguajes del conjunto de caracteres de doble byte (DBCS). En lugar de devolver el número de caracteres en una cadena, LenB devuelve el número de bytes utilizados para representar esa cadena. Con tipos de datos definidos por el usuario, LenB devuelve el tamaño en memoria, incluyendo cualquier relleno entre código que utiliza LenB, vea el segundo ejemplo en el tema de ejemplo.

Nota    Puede que Len no sea capaz de determinar el número real requerido de bytes de almacenamiento cuando se utiliza con cadenas de longitud variable entipos de datosdefinidos por el usuario.
--- Fin de la cita ---

Epa:
Buenas.

Sinceramente no se mucho del tema, pero se me ocurre que si obtienes los datos byte por byte para pasarlo a hexadecimal puedes hacer:

Hex(Asc(Dato))

O en caso de que sea una cadena

--- Código: Text ---   While (Pos < Len(Datos) - 1)    Hex(Asc(Mid(Datos,Pos,1) ' Eso se lo asignas a una variable o control donde quieras almacenar los datos    Pos = Pos + 1  Wend  
Bueno, espero mi pequeño aporte sirva de algo  :unsure:

Saludos

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa