Todas las entradas de: peplluis

Puertos Serie : Alta Velocidad?

Hace poco recibi una consulta sobre la velocidad de los puertos de comunicaciones. Os dejo un breve, esperando que os ayude en la compresion de lo que hay detras de un conector de 9 o 25 pins.


La mayoría de equipos incorporan en su ‘ChipSet’ UARTS compatibles con 16450.. 16550… y últimamente 16650 (Herederas de la mítica 8250 de National), la velocidad de transmisión y recepción viene fijada por las divisiones efectuadas al cuarzo y ajustadas en un registro interno de la misma, llamado BRG. Las UART actuales pueden llegar a velocidades de hasta 1,5M Baud..


–>> (Texto ejemplo de una hoja de características)


The UART includes a programmable baud rate generator that is capable of dividing the timing reference clock input by divisors of 1 to (216 -1), and producing a 16X clock for driving the internal transmitter logic.


Provisions are also included to use this 16X clock to drive the receiver logic. The UART has complete MODEM-control capability, and a processor-interrupt system. Interrupts can be programmed to the user’s requirements, minimizing the computing required to handle the communications link.



  • Fully programmable serial-interface characteristics:. 5-, 6-, 7-, or 8-bit characters. Even, odd or no-parity bit generation and detection. 1-, 11/2-or 2-stop bit generation . Baud generation ( DC to 1.5M baud )

Programmable Baud-Rate Generator
Each UART has its own Baud-Rate Generator (BRG) with a prescaler for the transmitter and receiver. The prescalar is controlled by a software bit in the MCR register. The MCR register bit 7 sets the prescalar to divide the on-board clock (14.7456 MHz) by 1 or 4. The output of the prescalar clocks the BRG. The BRG further divides the clock to a programmable divisor between 1 and (216-1) to obtain a 16X or 8X sampling clock of the serial data rate. The sampling clock is used by the transmitter for data bit shifting and receiver for data sampling.


 <<–
Tabla de configuracion de una UART segun el valor divisor.
































































[MCR Bit7=1 ] 


[MCR Bit7=0]   


[Divisor for 16X] 


[DLM (Hex)] 


[DLL (Hex)] 


600


2400


180


1


80


1200


4800


0C0


0


C0


2400


9600


060


0


60


4800


19.2k


030


0


30


9600


38.4k


018


0


18


19.2k


76.8k


00C


0


0C


38.4k


153.6k


006


0


06


57.6k


230.4k


004


0


04


115.2k


460.8k


002


0


02


Para los que utilizais la estructura DCB requerida para el acceso de puertos a traves del ‘kernel32.dll’ y aunque mi especialidad no es C++, es de  suponer que el limite correspondiente a la enumeración de velocidades ‘CBR_256000’ corresponde al hexadecimal que se envía al registro divisor de la UART para que este trabaje a la velocidad seleccionada una vez ejecutamos la orden de abrir el puerto. Aunque no se si es posible trabajar a velocidades superiores direccionando directamente los registro ‘MCR’ y ‘DL’ de las UARTS (complicado) se trataría de averiguar si añadiendo el valor de velocidad a la enumeración de la estructura DCB y su correspondencia con ‘MCR’ y ‘DL’, harian funcionar a la UART a una velocidad mayor a los 115200Bauds.


De todas formas hablando de velocidades, creo recordar que en anteriores versiones de Windows (95 o anteriores) el sistema no podía trabajar a velocidades altas (estaba limitado), pues por la naturaleza de la UART cada vez que recibe un carácter lanza una interrupción al procesador y ello podría provocar que el rendimiento general se resintiera, en la actualidad desconozco si existe alguna restricción a nivel de sistema operativo, cabe destacar que en .NET el System.IO.Ports.SerialPort puede trabajar hasta 115200 y creo no admite ninguna velocidad por encima de esta, dando como incorrecta cualquier valor que no pertenezca a la primera columna de la tabla, aunque reconozco no haber experimentado demasiado en este campo, porque realmente tampoco he sufrido esa necesidad.


P.C. (por cierto)… una manera de engañar al sistema seria abrir el port a 115200 y por la trastienda ajustar el Baud Rate MCR Bit7 a Cero!, pero creo que necesitariamos algun que otro Guru! 


Saludos,
Pep Lluis,

Puertos Serie?… Hasta cuando?

Repondiendo a las inquietudes de los que despues de 20 años contiuan viendo los conectores de 9 pins en nuestros equipos… comentaros que aunque parezca paradójico, la mayoría de Micros utilizados en la fabricación de dispositivos continúan disponiendo de una interfaz serie, aunque poco a poco se esta substituyendo por USB, algunos fabricantes están optando por integrar las comunicaciones a través de ethernet ya bien por RJ45 o WIFI.


Es difícil prever el panorama que nos espera, pues a pesar de todo, los chips continuaran incorporando interfaces como RS232, LIN, CAN, SPI, USB, RF, Infrarrojos o el nuevo ZigBee, mientras estos dispositivos utilicen comunicaciones en serie, los equipos informáticos que vayan a comunicarse con ellos necesitaran disponer de ese tipo de conexión.


NOTA: Los receptores GPS, intercambian la información a través de puertos y comunicación serie. Incluso cuando los integramos en un PDA el Buetooth extremo por extremo se convierte en un RS232.


Una de las virtudes de la comunicación serie es que solo implementa los tres primeros niveles del modelo OSI, ello lo hace tremendamente simple y sencillo de entender e implementar, de ahí que la mayoría de diseñadores continúen utilizándolo para tareas u aplicaciones básicas.


Tal y como tu apuntas los puertos serie irán desapareciendo paulatinamente de la parte posterior de nuestros equipos (la mayoría de portátiles ya no los incorporan), sin embargo existen un montón de accesorios USB-RS232 que conservaran esa herencia durante algunos años mas… o al menos eso creo!


Estare encantado de seguir con esta conversacion con quien se anime a continuarla!
Saludos,
Pep Lluis,

Visual Studio – Development Settings


Aunque parezca obvio, algunos de vosotros preguntáis como volver a la configuración inicial de Visual Studio. Como ya sabéis la primera vez que iniciamos VS, este nos invita a escoger un perfil de ajustes adaptado a nuestro lenguaje, inicialmente presenta personalización para Visual Basic… C#… General, etc. Algunos de vosotros tenéis la inquietud de hacer «un Reset» para volver a los ajustes originales del Perfil, pero no sabéis como. ¡Es muy Sencillo!.


Seleccionar ‘Herramientas‘ de la barra de menús de Visual Studio. A continuación la opción de ‘Importar y exportar configuraciones‘ os conducirá a un asistente con la opción ‘Restablecer todas las configuraciones‘; en este punto os dará la ocasión de omitir o salvar vuestra configuración actual y… ‘voila’ podéis volver a escoger o restablecer vuestra configuración favorita.


Pep Lluis,

Saber de los Hijos de un MDI

Una pregunta frecuente sobre los «Multiple Document Interfaces’ es como saber los forms que estan cargados en un momento determinado. Aqui os dejo un breve y como siempre ‘Simple’ ejemplo, para tener acceso a la lista de documentos cargados en un MDI.


Por supuesto faltara recorrer la lista de items en el ‘menuItem’ para procesar las decisiones en funcion a los forms cargados, pero supongo que esa es la parte facil… supongo bien?…


Cualquier sugerencia o comentario sera bien recibido,
Saludos,
Pep Lluis,

Public Class Form1   
  ‘   
  ‘Al cargar el form
   
  ‘
   
  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

       ‘El form1 se convierte en un MDIContainer
        Me.IsMdiContainer = True
        ‘Crear un nuevo boton para añadir
        Dim MiBoton As New Button
        MiBoton.Text = «Añadir»
        MiBoton.Dock = DockStyle.Bottom
        ‘Apuntar a la funcion de añadir al hacer click al boton
        AddHandler MiBoton.Click, AddressOf NuevoFormHijo
        ‘Añadir un boton al final del MDI
        Me.Controls.Add(MiBoton)
        ‘Crear un nuevo Menu
        Dim MiMenu As MainMenu = New MainMenu
        Me.Menu = MiMenu
        ‘Anadir item de forms cargados al menu
        Dim misForms As MenuItem = MiMenu.MenuItems.Add(«&Forms Cargados»)
        ‘este item debera visualizar la MdiList
        misForms.MdiList = True
    End Sub
   
    ‘Añadir un nuevo form al contenedor MDI
   
    Private Sub NuevoFormHijo(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim UnHijoMas As New Form
        UnHijoMas.Text = «He Nacido a las : « + System.DateTime.Now
        UnHijoMas.MdiParent = Me
        UnHijoMas.Show()
    End Sub

End Class


 

Compartir una Clase (VbDosFormsUnaBd)

Atendiendo la solicitud de Carlos…


«Bueno mi pregunta es la siguiente, tengo dos formularios el primero busca un nombre mediante un inputbox y encuentra el nombre y despliega nombre y apellidos mediante dos textbox, en este formulario quiero poner un boton que diga «Ver» y que me abra el otro formulario que ya tengo y me muestre direccion, telefono, edad, etc de ese nombre que encontro, la conexion de la tabla es con access mediante ado.
Gracias!!»


Os adjunto un ejemplo muy simple de como compartir una clase entre dos Forms.
Espero vuestras sugerencias.
Pep Lluis,


Como siempre podeis descargaros el ejemplo de ‘attachments’

Visual Studio, LoaderLock con proyectos que Utilizan DirectX o WinSocks.

«LoaderLock managed debugging assistant (MDA) detects attempts to execute managed code on a thread that holds the Microsoft Windows operating system loader lock. Any such execution is illegal because it can lead to deadlocks and to use of DLLs before they have been initialized by the operating system’s loader.»


O sea que los MDA’s detectan que estamos intentando ejecutar codigo administrado en un hilo que el cargador del sistema operativo tiene bloqueado, cualquier ejecucion es ilegal pues prodria perder los vinculos con los ‘deadlocks’ y usar las DLL’s antes de que estas hubieran sido inicializadas por el cargador del sistema operativo.


Acostumbra a ser un ‘toston’ en fases de desarrollo, pues solo afecta a los Debuggers, para poder sortear esta dificultat simplemente tienes que deshabilitar la opcion ‘loaderlock’ de Visual Studio.



  1. Pulsa ‘Ctrl+Alt+E’ (te aparecera la ventana de excepciones)

  2. Bajo ‘Managed Debugging Assistants’ busca ‘loaderlock’ 

  3. Click para dejarlo sin seleccion.

¡Listo! Cuando te pongas a trabajar… solo tendras que aceptar la advertencia de bloqueo… pero nada mas.


Saludos,
Pep Lluis,

VB Hablame!

Aprovechando la inquietud de algunos de vosotros en tanto a ‘TextSpeech’ y con la intencion de romper el hielo, os dejo un ejemplo muy simple de como hacer hablar a la Srta. Anna con tan solo una linea, usando el ‘System.Speech’.


Saludos,
Espero Vuestros comentarios…
Pep Lluis,


PD. Como siempre el proyecto ejemplo en ‘Attachments’