{"id":3257,"date":"2025-12-27T11:29:46","date_gmt":"2025-12-27T11:29:46","guid":{"rendered":"https:\/\/blog.rastersoft.com\/?p=3257"},"modified":"2025-12-27T11:29:46","modified_gmt":"2025-12-27T11:29:46","slug":"cuando-muchos-baudios-no-funcionan","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=3257","title":{"rendered":"Cuando muchos baudios no funcionan"},"content":{"rendered":"\n<p>Estos d\u00edas estoy haciendo un peque\u00f1o proyecto con un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Arduino_Uno\">Arduino UNO<\/a>, y me he encontrado con que el puerto serie no funciona correctamente a velocidades mayores de 57 600 baudios: cada vez que intentaba utilizar 115 200 baudios, mi terminal recib\u00eda basura.<\/p>\n\n\n\n<p>Tras mucho investigar, descubr\u00ed que el problema es debido a que la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Universal_asynchronous_receiver-transmitter\">UART<\/a> del <a href=\"https:\/\/en.wikipedia.org\/wiki\/ATmega328\">Atmega 328P<\/a> que lleva el Arduino UNO utiliza el mismo reloj externo de 16MHz, pero toma 16 muestras de cada bit, por lo que la velocidad efectiva es 1MHz. Esa frecuencia es la que se divide para obtener la velocidad de transmisi\u00f3n\/recepci\u00f3n deseada, y aqu\u00ed es donde viene el problema: la f\u00f3rmula para obtener el divisor que hay que programar en el registro del Atmega es, en el caso de un reloj externo de 16MHz como en el Arduino Uno, <em>(16 000 000 \/ 16\u00b7baudios) &#8211; 1<\/em>, y si calculamos el valor para 115 200, el resultado es <em>7,68<\/em>&#8230; que no es un n\u00famero entero, con lo que el divisor real ser\u00e1 7. Eso significa que la velocidad real del puerto serie es de 125 000 baudios. Tenemos un error de casi un 9%, que es mucho para un puerto serie. Para velocidades inferiores el error es menor; por ejemplo, para 57 600 tenemos que el valor es <em>16,36<\/em>, con lo que la velocidad real es 58 823, y el error es de aproximadamente un 2%, m\u00e1s que aceptable para un puerto serie.<\/p>\n\n\n\n<p>Podr\u00edamos pensar <em>\u00abBueno, pero si la UART a la que est\u00e1 conectada tambi\u00e9n utiliza un reloj de 1MHz, el error ser\u00e1 el mismo y deber\u00eda funcionar\u00bb<\/em>. Y as\u00ed es&#8230; salvo por el detalle de que no es el caso. El Arduino original era una placa dise\u00f1ada para conectarse directamente al <a href=\"https:\/\/en.wikipedia.org\/wiki\/RS-232\">puerto serie de un PC<\/a>, pero con la desaparici\u00f3n de \u00e9stos a manos del puerto <a href=\"https:\/\/en.wikipedia.org\/wiki\/USB\">USB<\/a>, el fabricante decidi\u00f3 a\u00f1adir un conversor USB&lt;->serie directamente en la placa, espec\u00edficamente el <a href=\"https:\/\/en.wikipedia.org\/wiki\/FTDI\">FT232<\/a>. Si nos fijamos en el esquema interno que viene en su <a href=\"https:\/\/ftdichip.com\/wp-content\/uploads\/2020\/08\/DS_FT232R.pdf\">datasheet<\/a>, vemos que la UART utiliza el mismo reloj que el subsistema USB, que es de 48MHz. Tambi\u00e9n en el datasheet vemos que el divisor de la UART ofrece un reloj con una frecuencia 16 veces superior a la deseada; pero dado que parte de una frecuencia tres veces superior, la precisi\u00f3n es mucho mayor. En concreto, para 115 200, la velocidad real es 115 385 baudios. Esto explica por qu\u00e9 no es capaz de comunicarse a esa velocidad con el microcontrolador: la diferencia es demasiada.<\/p>\n\n\n\n<p>\u00bfY c\u00f3mo solucionamos este problema? Simple: calculamos la velocidad real a la que est\u00e1 trabajando el sistema de menos precisi\u00f3n (Atmega), y utilizamos esa velocidad en el sistema de m\u00e1s precisi\u00f3n (FT232). Para ello, utilizamos la funci\u00f3n:<\/p>\n\n\n\n<p class=\"has-text-align-center\">velocidad_real = reloj_externo \/ (16\u00b7(floor(reloj_externo\/(16\u00b7velocidad deseada))))<\/p>\n\n\n\n<p>As\u00ed, si ponemos el Atmega a 115 200 baudios, la velocidad real ser\u00e1 125 000 baudios. Poniendo 125 000 baudios en el FT232 la velocidad real ser\u00e1&#8230; \u00a1125 000 baudios tambi\u00e9n! Lo que tiene sentido, porque la frecuencia de reloj del FT232 es un m\u00faltiplo entero de la del Atmega.<\/p>\n\n\n\n<p>Con este m\u00e9todo he podido aumentar la velocidad del puerto serie hasta 500 000 baudios sin problemas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Estos d\u00edas estoy haciendo un peque\u00f1o proyecto con un Arduino UNO, y me he encontrado con que el puerto serie no funciona correctamente a velocidades mayores de 57 600 baudios: cada vez que intentaba utilizar 115 200 baudios, mi terminal recib\u00eda basura. Tras mucho investigar, descubr\u00ed que el problema es debido a que la UART &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=3257\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Cuando muchos baudios no funcionan<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3257","post","type-post","status-publish","format-standard","hentry","category-sin-categoria"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3257"}],"version-history":[{"count":1,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3257\/revisions"}],"predecessor-version":[{"id":3258,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3257\/revisions\/3258"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}