Programación General > Visual Basic 6.0 e inferiores
Transmision Serie
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
[#] Página Siguiente
Ir a la versión completa