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,

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>