• Viernes 19 de Abril de 2024, 13:45

Autor Tema:  Transmision Serie  (Leído 4750 veces)

hanna

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Transmision Serie
« en: Lunes 16 de Abril de 2007, 04:43 »
0
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

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
    • http://drakerdg.xbot.es/wordpress/
Re: Transmision Serie
« Respuesta #1 en: Lunes 16 de Abril de 2007, 23:25 »
0
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.
Saludos desde Guatemala, C. A.
Electrobotics

Toph

  • Moderador
  • ******
  • Mensajes: 420
  • Nacionalidad: sv
    • Ver Perfil
    • http://www.electronicayotros.blogspot.com/
Re: Transmision Serie
« Respuesta #2 en: Miércoles 18 de Abril de 2007, 05:55 »
0
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.
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 ???????????????????????????
asi que la unica solucion que encontre es convertirlos despues de recibidos, cualquier cosa por ahi tengo las rutinas



saludos a ambos :hola:
Por favor leer esto antes de postear. Gracias
NO alimenten al TROLL y morirá
¿Querés ayudar?, pues doná comida gratis con un simple clic aqui ,sin trucos
photobucket , Google , wine y cutepdf Rock!!!


programacion,c,c++,
Microcontroladores,java,linux,videojuegos,
,.NET,asm,codigo
por favor este 2012 que sea

DrakerDG

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
    • http://drakerdg.xbot.es/wordpress/
Re: Transmision Serie
« Respuesta #3 en: Miércoles 18 de Abril de 2007, 18:23 »
0
Citar
Si InputMode vale 1 (comInputModeBinary), habilito recibir caracteres no imprimibles o sea siempre se recibiran en ASCII.

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
  1. Public Sub COM_IN()
  2. Dim Buffer As String
  3. Dim lBuf As Integer
  4. Dim cCH As Integer
  5. Dim cBT As Byte
  6. Dim cBX As Byte
  7. Dim sBX As String
  8. With frmOsc
  9. If CRdy Then
  10.     Buffer = .comX.Input
  11. Else
  12.     Buffer = ""
  13. End If
  14. lBuf = LenB(Buffer)
  15. For cCH = 1 To lBuf
  16.     cBT = AscB(MidB(Buffer, cCH, 1))
  17.     Xo = Xo + 1
  18.     If cBT = 127 Then
  19.         Xo = 0
  20.         If SetV.DATb(0) Then
  21.             For cBX = 0 To 127
  22.                 SetV.DATb(cBX + 5) = True
  23.             Next
  24.             SetV.DATb(133) = True
  25.             SetV.DATb(0) = False
  26.         End If
  27.     End If
  28.     If cBT = 126 Then
  29.         Xo = 0
  30.         .lblW.Visible = True
  31.     Else
  32.         .lblW.Visible = False
  33.     End If
  34.     If (Xo > 0) And (Xo < 138) Then
  35.         If (cBT <> SetV.DATx(Xo)) Or SetV.DATb(Xo) Then
  36.             Select Case Xo
  37.                 Case 1  'Volts per division
  38.                     cBX = (cBT And 12)
  39.                     Select Case cBX
  40.                         Case 0
  41.                             sBX = IIf(.TB.Buttons(8).Value, " 0.25 V/div", " 1 V")
  42.                             DVM(2) = "."
  43.                             DVM(4) = ""
  44.                             DVM(6) = ""
  45.                             SetV.VxDv = 1
  46.                         Case 4
  47.                             sBX = IIf(.TB.Buttons(8).Value, " 2.5 V/div", " 10 V")
  48.                             DVM(2) = ""
  49.                             DVM(4) = "."
  50.                             DVM(6) = ""
  51.                             SetV.VxDv = 10
  52.                         Case 8
  53.                             sBX = IIf(.TB.Buttons(8).Value, " 25 V/div", " 100 V")
  54.                             DVM(2) = ""
  55.                             DVM(4) = ""
  56.                             DVM(6) = "."
  57.                             SetV.VxDv = 100
  58.                     End Select
  59.                     .lcdE(3).Text = sBX
  60.                     cBX = (cBT And 48)
  61.                     Select Case cBX
  62.                         Case 0
  63.                             .lcdE(2).Text = " GROUND"
  64.                             .lcdE(2).CharColor = &HFF&
  65.                             DVM(7) = " GND"
  66.                         Case 16
  67.                             .lcdE(2).Text = " AC"
  68.                             .lcdE(2).CharColor = &H666A51
  69.                             DVM(7) = " VAC"
  70.                         Case 32
  71.                             .lcdE(2).Text = " DC"
  72.                             .lcdE(2).CharColor = &H666A51
  73.                             DVM(7) = " VDC"
  74.                     End Select
  75. '                    Beep
  76.                 Case 2  'Time / Frec per division
  77.                     Select Case cBT
  78.                         Case 0
  79.                             sBX = IIf(.TB.Buttons(8).Value, " 0.5 µs/div 20MS", " 50 ns 20MS")
  80.                             SetV.TxDv = 5
  81.                         Case 1
  82.                             sBX = IIf(.TB.Buttons(8).Value, " 1 µs/div 10MS", " 100 ns 10MS")
  83.                             SetV.TxDv = 10
  84.                         Case 2
  85.                             sBX = IIf(.TB.Buttons(8).Value, " 5 µs/div 2MS", " 0.5 µs 2MS")
  86.                             SetV.TxDv = 50
  87.                         Case 3
  88.                             sBX = IIf(.TB.Buttons(8).Value, " 10 µs/div 1MS", " 1 µs 1MS")
  89.                             SetV.TxDv = 100
  90.                         Case 4
  91.                             sBX = IIf(.TB.Buttons(8).Value, " 50 µs/div 200KS", " 5 µs 200KS")
  92.                             SetV.TxDv = 500
  93.                         Case 5
  94.                             sBX = IIf(.TB.Buttons(8).Value, " 100 µs/div 100KS", " 10 µs 100KS")
  95.                             SetV.TxDv = 1000
  96.                         Case 6
  97.                             sBX = IIf(.TB.Buttons(8).Value, " 0.5 ms/div 20KS", " 50 µs 20KS")
  98.                             SetV.TxDv = 5
  99.                         Case 7
  100.                             sBX = IIf(.TB.Buttons(8).Value, " 1 ms/div 10KS", " 0.1 ms 10KS")
  101.                             SetV.TxDv = 10
  102.                         Case 8
  103.                             sBX = IIf(.TB.Buttons(8).Value, " 5 ms/div 2KS", " 0.5 ms 2KS")
  104.                             SetV.TxDv = 50
  105.                         Case 9
  106.                             sBX = IIf(.TB.Buttons(8).Value, " 10 ms/div 1KS", " 1 ms 1KS")
  107.                             SetV.TxDv = 100
  108.                     End Select
  109.                     .lcdE(0).Text = sBX
  110.                     If cBT < 6 Then
  111.                         SetV.Tdim = IIf(.TB.Buttons(14).Value, "MHz", "µs")
  112.                     Else
  113.                         SetV.Tdim = IIf(.TB.Buttons(14).Value, "KHz", "ms")
  114.                     End If
  115.                 Case 3  'Trigger status
  116.                     cBX = (cBT And 120)
  117.                     If (cBT And 1) = 1 Then
  118.                         sBX = "SINGLE"
  119.                     Else
  120.                         sBX = "RUN"
  121.                     End If
  122.                     Select Case cBX
  123.                         Case 0
  124.                             sBX = " AUTO"
  125.                         Case 8
  126.                             sBX = " -EXTERN/" + sBX
  127.                         Case 16
  128.                             sBX = " +EXTERN/" + sBX
  129.                         Case 32
  130.                             sBX = " -INTERN/" + sBX
  131.                         Case 64
  132.                             sBX = " +INTERN/" + sBX
  133.                     End Select
  134.                     .lcdE(1).Text = sBX
  135. '                    Beep
  136.                 Case 4  'Triger level
  137.                     Select Case cBT
  138.                         Case 0
  139.                             SetV.Tlev = 1
  140.                         Case 2
  141.                             SetV.Tlev = 6
  142.                         Case 4
  143.                             SetV.Tlev = 5
  144.                         Case 8
  145.                             SetV.Tlev = 4
  146.                         Case 16
  147.                             SetV.Tlev = 3
  148.                         Case 32
  149.                             SetV.Tlev = 2
  150.                     End Select
  151. '                    Beep
  152.                 Case 5  'Signal info.
  153.                     .Dt(Xo - 5).Y1 = .SCR.Top + .SCR.Height - cBT * SV
  154.                     If SetV.DATb(Xo) Then
  155.                         .Dc(Xo - 5).Y1 = .Dt(Xo - 5).Y1
  156.                         .Dc(Xo - 5).Visible = .TB.Buttons(13).Value
  157.                         SetV.DATc(Xo) = cBT
  158.                         SetV.DATb(Xo) = False
  159.                     End If
  160.                 Case 6 To 132  'Signal info
  161.                     .Dt(Xo - 6).Y2 = .SCR.Top + .SCR.Height - cBT * SV
  162.                     .Dt(Xo - 5).Y1 = .SCR.Top + .SCR.Height - cBT * SV
  163.                     If SetV.DATb(Xo) Then
  164.                         .Dc(Xo - 6).Y2 = .Dt(Xo - 6).Y2
  165.                         .Dc(Xo - 5).Y1 = .Dt(Xo - 5).Y1
  166.                         .Dc(Xo - 5).Visible = .TB.Buttons(13).Value
  167.                         SetV.DATc(Xo) = cBT
  168.                     End If
  169.                 Case 133 'Signal info.
  170.                     .Dt(Xo - 6).Y2 = .SCR.Top + .SCR.Height - cBT * SV
  171.                     If SetV.DATb(Xo) Then
  172.                         .Dc(Xo - 6).Y2 = .Dt(Xo - 6).Y2
  173.                         SetV.DATc(Xo) = cBT
  174.                     End If
  175.                 Case 134   'Hundred DVM
  176.                     DVM(1) = Trim(Str(cBT))
  177.                 Case 135    'Ten DVM
  178.                     DVM(3) = Trim(Str(cBT))
  179.                 Case 136    'Unit DVM
  180.                     DVM(5) = Trim(Str(cBT))
  181.                 Case 137    'Negative Voltage.
  182.                     If (cBT And 8) = 8 Then
  183.                         DVM(0) = "-"
  184.                     Else
  185.                         DVM(0) = "+"
  186.                     End If
  187.                     If (cBT And 3) > 0 Then
  188.                         If (cBT And 8) = 8 Then
  189.                             DVM(8) = "<"
  190.                         Else
  191.                             DVM(8) = ">"
  192.                         End If
  193.                         Beep
  194.                     Else
  195.                         DVM(8) = ""
  196.                     End If
  197.             End Select
  198.             DVMtx = " " & DVM(0) & DVM(1) & DVM(2) & DVM(3) & DVM(4) & DVM(5) & DVM(6) & DVM(7)
  199.             If .lcdE(6).Text <> DVMtx Then
  200.                 .lcdE(6).Text = DVMtx
  201.             End If
  202.             If SetV.DATx(Xo) <> cBT Then
  203.                 SetV.DATx(Xo) = cBT
  204.             End If
  205.             If SetV.DATb(Xo) Then
  206.                 SetV.DATb(Xo) = False
  207.             End If
  208.         End If
  209.     End If
  210. Next
  211. End With
  212.  
  213. End Sub
  214.  

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.

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.
Saludos desde Guatemala, C. A.
Electrobotics

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Transmision Serie
« Respuesta #4 en: Miércoles 18 de Abril de 2007, 20:52 »
0
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
  1.  
  2.   While (Pos < Len(Datos) - 1)
  3.     Hex(Asc(Mid(Datos,Pos,1) ' Eso se lo asignas a una variable o control donde quieras almacenar los datos
  4.     Pos = Pos + 1
  5.   Wend
  6.  
  7.  

Bueno, espero mi pequeño aporte sirva de algo  :unsure:

Saludos
The sweet smell of a great sorrow lies over the land.


DrakerDG

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
    • http://drakerdg.xbot.es/wordpress/
Re: Transmision Serie
« Respuesta #5 en: Jueves 19 de Abril de 2007, 01:03 »
0
Citar
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))

En este caso da error cuando se trate de bytes cuyo codigo en ASCII no sea imprimible. por lo que funciona si utilizas estas otras funciones:

Hex(AscB(Dato)

Código: Text
  1. While (Pos < LenB(Datos) - 1)
  2.    Hex(AscB(MidB(Datos,Pos,1) ' Eso se lo asignas a una variable o control donde quieras almacenar los datos
  3.    Pos = Pos + 1
  4.  Wend
  5.  

La B de estas funciones (AscB, LenB, MidB) garantiza que trabajara con la cadena de bytes sin pre-definir en ASCII, es decir con el valor del byte tal cual es.
Saludos desde Guatemala, C. A.
Electrobotics

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Transmision Serie
« Respuesta #6 en: Jueves 19 de Abril de 2007, 18:53 »
0
Me haces quedar mal  :P

No tenia idea de eso, buen punto.  :o

Saludos
The sweet smell of a great sorrow lies over the land.


DrakerDG

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
    • http://drakerdg.xbot.es/wordpress/
Re: Transmision Serie
« Respuesta #7 en: Viernes 20 de Abril de 2007, 23:31 »
0
Epa:
    No es mi intension hecerte quedar mal, no creas, al principio me partí la cabeza cuando intenté conectar un osciloscopio al serial e interpretar los códigos desde VB.  No entendía porque unos codigos si los leia y otros no, y todo por la funcion Len(), esta no contaba los codigos no imprimibles y por consiguiente me era imposible entender la trama de los codigos.  No detectaba algunos.  Hasta llegué a pensar que el osciloscopio no funcionaba bien, incluso culpe al cable y hasta el puerto serial, que si que en la ayuda del MSDN  estaba hasta abajo una notita en la informacion del Len(), donde comentaba la diferencia en caso de querer contar caracteres como byte o sea LenB().  

Por una letrita todo el lio que se me armó. :D .  Consecuentemente encontre que tambien tenía que usar MidB() en vez de Mid(), AscB() en vez de Asc(), y así sucecibamente. :hola:
Saludos desde Guatemala, C. A.
Electrobotics