<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>UART (Serial) - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/categorias/protoclos/uart-serial/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Sun, 19 Apr 2026 18:27:01 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>UART (Serial) - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Baud Rate: o que é, origem, tabela completa e como escolher a taxa ideal na comunicação serial</title>
		<link>https://mcu.tec.br/protoclos/uart-serial/baud-rate-o-que-e-origem-tabela-completa-e-como-escolher-a-taxa-ideal-na-comunicacao-serial/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=baud-rate-o-que-e-origem-tabela-completa-e-como-escolher-a-taxa-ideal-na-comunicacao-serial</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Mon, 20 Apr 2026 18:21:56 +0000</pubDate>
				<category><![CDATA[UART (Serial)]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1426</guid>

					<description><![CDATA[<p>Entenda de forma didática o que é baud rate, sua origem histórica ligada à telegrafia de Émile Baudot e como essa taxa influencia diretamente a comunicação serial em sistemas embarcados modernos. Neste artigo, você verá uma explicação clara sobre a diferença entre baud rate e bits por segundo, além de compreender o impacto do tempo de bit na transmissão de dados. Apresentamos também uma tabela completa com os principais baud rates, suas velocidades reais e duração dos bits, além de destacar as taxas mais utilizadas como 9600, 115200 e 921600 baud, explicando em quais contextos são aplicadas, desde sistemas industriais até IoT e debug de firmware.</p>
<p>The post <a href="https://mcu.tec.br/protoclos/uart-serial/baud-rate-o-que-e-origem-tabela-completa-e-como-escolher-a-taxa-ideal-na-comunicacao-serial/">Baud Rate: o que é, origem, tabela completa e como escolher a taxa ideal na comunicação serial</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Quando trabalhamos com sistemas embarcados, comunicação serial ou redes industriais, um dos primeiros termos que aparece é <strong>baud rate</strong> (ou taxa de transmissão). Embora muitas vezes tratado de forma superficial como “velocidade da comunicação”, o conceito possui uma origem histórica interessante e nuances técnicas importantes que impactam diretamente a confiabilidade e o desempenho dos sistemas.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">O que é Baud Rate</h3>



<p class="wp-block-paragraph">O termo <em>baud</em> representa a <strong>quantidade de símbolos transmitidos por segundo</strong> em um canal de comunicação. Em sistemas simples, como UART (Universal Asynchronous Receiver/Transmitter), cada símbolo geralmente corresponde a um bit, e por isso, na prática, baud rate costuma ser tratado como equivalente a <strong>bits por segundo (bps)</strong>.</p>



<p class="wp-block-paragraph">No entanto, tecnicamente, eles não são sempre iguais. Em sistemas mais complexos (como modulações QAM), um único símbolo pode carregar múltiplos bits. Mas no contexto mais comum em microcontroladores — como STM32, ESP32 ou RP2040 — temos:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>1 baud ≈ 1 bit por segundo</strong></p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Origem do termo</h3>



<p class="wp-block-paragraph">O nome <em>baud</em> vem de <strong>Émile Baudot</strong>, engenheiro francês que desenvolveu um dos primeiros sistemas de telegrafia digital no século XIX. Seu sistema utilizava códigos binários para transmitir caracteres, sendo um dos precursores diretos da comunicação digital moderna.</p>



<p class="wp-block-paragraph">Na época, a preocupação principal era sincronizar transmissor e receptor em meios físicos limitados, como linhas telegráficas. Essa limitação influenciou diretamente as primeiras taxas padronizadas que ainda vemos hoje.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Como o Baud Rate é utilizado na prática</h3>



<p class="wp-block-paragraph">Em sistemas modernos, especialmente embarcados, o baud rate é fundamental em protocolos como:</p>



<ul class="wp-block-list">
<li>UART (comunicação serial clássica)</li>



<li>RS-232, RS-485 (ambientes industriais)</li>



<li>Comunicação com módulos (GPS, GSM, Bluetooth)</li>



<li>Bootloaders e debug via terminal serial</li>
</ul>



<p class="wp-block-paragraph">Cada taxa define <strong>quanto tempo dura cada bit</strong>, o que impacta diretamente:</p>



<ul class="wp-block-list">
<li>sincronização entre dispositivos</li>



<li>tolerância a ruído</li>



<li>distância da comunicação</li>



<li>consumo de energia</li>
</ul>



<p class="wp-block-paragraph">Por exemplo, em <strong>9600 baud</strong>, cada bit dura aproximadamente <strong>104 µs</strong>, enquanto em <strong>115200 baud</strong>, dura apenas <strong>8.68 µs</strong>, exigindo maior precisão de clock.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Entendendo a diferença entre velocidade teórica e real</h3>



<p class="wp-block-paragraph">Na tabela fornecida, aparecem dois valores importantes:</p>



<ul class="wp-block-list">
<li><strong>Speed (bytes/s)</strong> → taxa teórica considerando 8 bits por byte</li>



<li><strong>Actual speed (bytes/s)</strong> → taxa real considerando overhead da UART</li>
</ul>



<p class="wp-block-paragraph">Esse overhead vem do formato típico de transmissão:</p>



<pre class="wp-block-code"><code>1 bit de start + 8 bits de dados + 1 bit de stop = 10 bits por byte
</code></pre>



<p class="wp-block-paragraph">Ou seja:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">A eficiência real é de aproximadamente <strong>80%</strong> (8/10)</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Tabela de Baud Rates</h3>



<p class="wp-block-paragraph">Abaixo está a tabela organizada com os dados fornecidos:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Bauds</th><th>Bits/s</th><th>Duração do bit</th><th>Velocidade (bytes/s)</th><th>Velocidade real (bytes/s)</th><th>Duração real por byte</th></tr></thead><tbody><tr><td>50</td><td>50</td><td>20.000 ms</td><td>6.25</td><td>5</td><td>200.000 ms</td></tr><tr><td>75</td><td>75</td><td>13.333 ms</td><td>9.375</td><td>7.5</td><td>133.333 ms</td></tr><tr><td>110</td><td>110</td><td>9.091 ms</td><td>13.75</td><td>11</td><td>90.909 ms</td></tr><tr><td>134</td><td>134</td><td>7.463 ms</td><td>16.75</td><td>13.4</td><td>74.627 ms</td></tr><tr><td>150</td><td>150</td><td>6.667 ms</td><td>18.75</td><td>15</td><td>66.667 ms</td></tr><tr><td>200</td><td>200</td><td>5.000 ms</td><td>25</td><td>20</td><td>50.000 ms</td></tr><tr><td>300</td><td>300</td><td>3.333 ms</td><td>37.5</td><td>30</td><td>33.333 ms</td></tr><tr><td>600</td><td>600</td><td>1.667 ms</td><td>75</td><td>60</td><td>16.667 ms</td></tr><tr><td>1200</td><td>1200</td><td>833.333 µs</td><td>150</td><td>120</td><td>8.333 ms</td></tr><tr><td>1800</td><td>1800</td><td>555.556 µs</td><td>225</td><td>180</td><td>5.556 ms</td></tr><tr><td>2400</td><td>2400</td><td>416.667 µs</td><td>300</td><td>240</td><td>4.167 ms</td></tr><tr><td>4800</td><td>4800</td><td>208.333 µs</td><td>600</td><td>480</td><td>2.083 ms</td></tr><tr><td>9600</td><td>9600</td><td>104.167 µs</td><td>1200</td><td>960</td><td>1.042 ms</td></tr><tr><td>19200</td><td>19200</td><td>52.083 µs</td><td>2400</td><td>1920</td><td>520.833 µs</td></tr><tr><td>28800</td><td>28800</td><td>34.722 µs</td><td>3600</td><td>2880</td><td>347.222 µs</td></tr><tr><td>38400</td><td>38400</td><td>26.042 µs</td><td>4800</td><td>3840</td><td>260.417 µs</td></tr><tr><td>57600</td><td>57600</td><td>17.361 µs</td><td>7200</td><td>5760</td><td>173.611 µs</td></tr><tr><td>76800</td><td>76800</td><td>13.021 µs</td><td>9600</td><td>7680</td><td>130.208 µs</td></tr><tr><td>115200</td><td>115200</td><td>8.681 µs</td><td>14400</td><td>11520</td><td>86.806 µs</td></tr><tr><td>230400</td><td>230400</td><td>4.340 µs</td><td>28800</td><td>23040</td><td>43.403 µs</td></tr><tr><td>460800</td><td>460800</td><td>2.170 µs</td><td>57600</td><td>46080</td><td>21.701 µs</td></tr><tr><td>576000</td><td>576000</td><td>1.736 µs</td><td>72000</td><td>57600</td><td>17.361 µs</td></tr><tr><td>921600</td><td>921600</td><td>1.085 µs</td><td>115200</td><td>92160</td><td>10.851 µs</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Velocidades mais usadas e seus contextos</h3>



<p class="wp-block-paragraph">Na prática, algumas taxas se tornaram padrão de mercado:</p>



<p class="wp-block-paragraph"><strong>9600 baud</strong><br>Muito utilizado em sistemas legados, sensores simples e comunicação robusta em ambientes com ruído. Ideal quando confiabilidade é mais importante que velocidade.</p>



<p class="wp-block-paragraph"><strong>19200 e 38400 baud</strong><br>Utilizados em sistemas industriais e automação, oferecendo bom equilíbrio entre velocidade e estabilidade.</p>



<p class="wp-block-paragraph"><strong>57600 baud</strong><br>Comum em comunicação com módulos embarcados intermediários (GPS, modems antigos).</p>



<p class="wp-block-paragraph"><strong>115200 baud</strong><br>O padrão mais usado atualmente para debug serial, comunicação com PCs e bootloaders. É rápido o suficiente para logs e transferência moderada de dados.</p>



<p class="wp-block-paragraph"><strong>230400 a 921600 baud</strong><br>Usados em aplicações mais exigentes, como:</p>



<ul class="wp-block-list">
<li>streaming de dados de sensores</li>



<li>comunicação com displays</li>



<li>transferência de arquivos</li>



<li>aplicações IoT de maior throughput</li>
</ul>



<p class="wp-block-paragraph">Porém, nessas velocidades, entram desafios importantes:</p>



<ul class="wp-block-list">
<li>precisão do clock (erro percentual)</li>



<li>interferência eletromagnética</li>



<li>qualidade do layout de PCB</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Considerações de Engenharia</h3>



<p class="wp-block-paragraph">Ao escolher o baud rate em um projeto embarcado, você deve considerar:</p>



<ul class="wp-block-list">
<li><strong>Clock do sistema</strong>: erros de divisão podem gerar falhas de sincronização</li>



<li><strong>Comprimento do cabo</strong>: quanto maior, menor deve ser a taxa</li>



<li><strong>Ambiente</strong>: ruído industrial exige taxas menores</li>



<li><strong>Buffer e DMA</strong>: taxas altas exigem melhor gestão de dados</li>
</ul>



<p class="wp-block-paragraph">Uma decisão errada aqui pode gerar desde perda de dados até travamentos intermitentes difíceis de depurar.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/protoclos/uart-serial/baud-rate-o-que-e-origem-tabela-completa-e-como-escolher-a-taxa-ideal-na-comunicacao-serial/">Baud Rate: o que é, origem, tabela completa e como escolher a taxa ideal na comunicação serial</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1426</post-id>	</item>
		<item>
		<title>Protocolos auto-sincronizáveis em sistemas embarcados</title>
		<link>https://mcu.tec.br/protoclos/uart-serial/protocolos-auto-sincronizaveis-em-sistemas-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=protocolos-auto-sincronizaveis-em-sistemas-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sat, 17 Jan 2026 10:20:00 +0000</pubDate>
				<category><![CDATA[UART (Serial)]]></category>
		<category><![CDATA[CBOR]]></category>
		<category><![CDATA[COBS]]></category>
		<category><![CDATA[comunicação serial robusta]]></category>
		<category><![CDATA[framing serial]]></category>
		<category><![CDATA[protocolos auto-sincronizáveis]]></category>
		<category><![CDATA[protocolos binários]]></category>
		<category><![CDATA[protocolos seriais]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[SLIP]]></category>
		<category><![CDATA[UART embarcado]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1108</guid>

					<description><![CDATA[<p>Entenda como funcionam os protocolos auto-sincronizáveis SLIP, COBS e CBOR em sistemas embarcados. Veja exemplos em C, comparações técnicas, boas e más escolhas de engenharia e descubra como projetar comunicações seriais robustas para UART, SPI e IoT.</p>
<p>The post <a href="https://mcu.tec.br/protoclos/uart-serial/protocolos-auto-sincronizaveis-em-sistemas-embarcados/">Protocolos auto-sincronizáveis em sistemas embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-3810l wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-3810l "><div class="eb-toc-container eb-toc-3810l  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:3,&quot;content&quot;:&quot;Conceito, motiva\u00e7\u00e3o e panorama geral&quot;,&quot;text&quot;:&quot;Conceito, motiva\u00e7\u00e3o e panorama geral&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa \u201cauto-sincroniza\u00e7\u00e3o\u201d na pr\u00e1tica&quot;,&quot;text&quot;:&quot;O que significa \u201cauto-sincroniza\u00e7\u00e3o\u201d na pr\u00e1tica&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Vis\u00e3o geral dos protocolos que vamos estudar&quot;,&quot;text&quot;:&quot;Vis\u00e3o geral dos protocolos que vamos estudar&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boas e m\u00e1s decis\u00f5es logo no in\u00edcio&quot;,&quot;text&quot;:&quot;Boas e m\u00e1s decis\u00f5es logo no in\u00edcio&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;SLIP (Serial Line Internet Protocol): simplicidade que cobra seu pre\u00e7o&quot;,&quot;text&quot;:&quot;SLIP (Serial Line Internet Protocol): simplicidade que cobra seu pre\u00e7o&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Como o SLIP funciona (byte a byte)&quot;,&quot;text&quot;:&quot;Como o SLIP funciona (byte a byte)&quot;,&quot;link&quot;:&quot;como-o-slip-funciona-byte-a-byte&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo conceitual de framing SLIP&quot;,&quot;text&quot;:&quot;Exemplo conceitual de framing SLIP&quot;,&quot;link&quot;:&quot;exemplo-conceitual-de-framing-slip&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Implementa\u00e7\u00e3o did\u00e1tica \u2014 Encoder SLIP em C&quot;,&quot;text&quot;:&quot;Implementa\u00e7\u00e3o did\u00e1tica \u2014 Encoder SLIP em C&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Decoder SLIP (lado cr\u00edtico)&quot;,&quot;text&quot;:&quot;Decoder SLIP (lado cr\u00edtico)&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Onde o SLIP \u00e9 uma boa escolha&quot;,&quot;text&quot;:&quot;Onde o SLIP \u00e9 uma boa escolha&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Onde o SLIP \u00e9 uma m\u00e1 escolha (e por qu\u00ea)&quot;,&quot;text&quot;:&quot;Onde o SLIP \u00e9 uma m\u00e1 escolha (e por qu\u00ea)&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;text&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;COBS (Consistent Overhead Byte Stuffing): framing determin\u00edstico e recupera\u00e7\u00e3o real&quot;,&quot;text&quot;:&quot;COBS (Consistent Overhead Byte Stuffing): framing determin\u00edstico e recupera\u00e7\u00e3o real&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Ideia central do COBS&quot;,&quot;text&quot;:&quot;Ideia central do COBS&quot;,&quot;link&quot;:&quot;ideia-central-do-cobs&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo conceitual&quot;,&quot;text&quot;:&quot;Exemplo conceitual&quot;,&quot;link&quot;:&quot;exemplo-conceitual&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Encoder COBS \u2014 implementa\u00e7\u00e3o did\u00e1tica em C&quot;,&quot;text&quot;:&quot;Encoder COBS \u2014 implementa\u00e7\u00e3o did\u00e1tica em C&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Decoder COBS \u2014 recupera\u00e7\u00e3o previs\u00edvel&quot;,&quot;text&quot;:&quot;Decoder COBS \u2014 recupera\u00e7\u00e3o previs\u00edvel&quot;,&quot;link&quot;:&quot;eb-table-content-16&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Por que COBS \u00e9 realmente auto-sincroniz\u00e1vel&quot;,&quot;text&quot;:&quot;Por que COBS \u00e9 realmente auto-sincroniz\u00e1vel&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boas e m\u00e1s escolhas com COBS&quot;,&quot;text&quot;:&quot;Boas e m\u00e1s escolhas com COBS&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Compara\u00e7\u00e3o direta: SLIP \u00d7 COBS&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o direta: SLIP \u00d7 COBS&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;text&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;CBOR (Concise Binary Object Representation): sem\u00e2ntica bin\u00e1ria n\u00e3o \u00e9 framing&quot;,&quot;text&quot;:&quot;CBOR (Concise Binary Object Representation): sem\u00e2ntica bin\u00e1ria n\u00e3o \u00e9 framing&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que o CBOR realmente define&quot;,&quot;text&quot;:&quot;O que o CBOR realmente define&quot;,&quot;link&quot;:&quot;o-que-o-cbor-realmente-define&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo conceitual: CBOR vs JSON&quot;,&quot;text&quot;:&quot;Exemplo conceitual: CBOR vs JSON&quot;,&quot;link&quot;:&quot;exemplo-conceitual-cbor-vs-json&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erro cl\u00e1ssico: \u201cvou ler CBOR direto da UART\u201d&quot;,&quot;text&quot;:&quot;Erro cl\u00e1ssico: \u201cvou ler CBOR direto da UART\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Uso correto: CBOR como payload, COBS como transporte&quot;,&quot;text&quot;:&quot;Uso correto: CBOR como payload, COBS como transporte&quot;,&quot;link&quot;:&quot;uso-correto-cbor-como-payload-cobs-como-transporte&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo did\u00e1tico \u2014 gerando CBOR (C)&quot;,&quot;text&quot;:&quot;Exemplo did\u00e1tico \u2014 gerando CBOR (C)&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Encapsulando CBOR com COBS&quot;,&quot;text&quot;:&quot;Encapsulando CBOR com COBS&quot;,&quot;link&quot;:&quot;encapsulando-cbor-com-cobs&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boas e m\u00e1s escolhas com CBOR&quot;,&quot;text&quot;:&quot;Boas e m\u00e1s escolhas com CBOR&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Compara\u00e7\u00e3o direta: COBS \u00d7 CBOR&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o direta: COBS \u00d7 CBOR&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;text&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Compara\u00e7\u00e3o geral, decis\u00f5es de projeto e checklist de boas pr\u00e1ticas&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o geral, decis\u00f5es de projeto e checklist de boas pr\u00e1ticas&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Compara\u00e7\u00e3o t\u00e9cnica consolidada&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o t\u00e9cnica consolidada&quot;,&quot;link&quot;:&quot;eb-table-content-32&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Arquiteturas t\u00edpicas (boas escolhas)&quot;,&quot;text&quot;:&quot;Arquiteturas t\u00edpicas (boas escolhas)&quot;,&quot;link&quot;:&quot;eb-table-content-33&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;M\u00e1s decis\u00f5es cl\u00e1ssicas (e por que falham)&quot;,&quot;text&quot;:&quot;M\u00e1s decis\u00f5es cl\u00e1ssicas (e por que falham)&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Checklist de boas pr\u00e1ticas (engenharia de firmware)&quot;,&quot;text&quot;:&quot;Checklist de boas pr\u00e1ticas (engenharia de firmware)&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Regra pr\u00e1tica para n\u00e3o errar&quot;,&quot;text&quot;:&quot;Regra pr\u00e1tica para n\u00e3o errar&quot;,&quot;link&quot;:&quot;eb-table-content-36&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conclus\u00e3o do artigo&quot;,&quot;text&quot;:&quot;Conclus\u00e3o do artigo&quot;,&quot;link&quot;:&quot;eb-table-content-37&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Conceito, motiva\u00e7\u00e3o e panorama geral&quot;,&quot;value&quot;:&quot;conceito-motiva\u00e7\u00e3o-e-panorama-geral&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa \u201cauto-sincroniza\u00e7\u00e3o\u201d na pr\u00e1tica&quot;,&quot;value&quot;:&quot;o-que-significa-auto-sincroniza\u00e7\u00e3o-na-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Vis\u00e3o geral dos protocolos que vamos estudar&quot;,&quot;value&quot;:&quot;vis\u00e3o-geral-dos-protocolos-que-vamos-estudar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boas e m\u00e1s decis\u00f5es logo no in\u00edcio&quot;,&quot;value&quot;:&quot;boas-e-m\u00e1s-decis\u00f5es-logo-no-in\u00edcio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;SLIP (Serial Line Internet Protocol): simplicidade que cobra seu pre\u00e7o&quot;,&quot;value&quot;:&quot;slip-serial-line-internet-protocol-simplicidade-que-cobra-seu-pre\u00e7o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Como o SLIP funciona (byte a byte)&quot;,&quot;value&quot;:&quot;como-o-slip-funciona-byte-a-byte&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo conceitual de framing SLIP&quot;,&quot;value&quot;:&quot;exemplo-conceitual-de-framing-slip&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Implementa\u00e7\u00e3o did\u00e1tica \u2014 Encoder SLIP em C&quot;,&quot;value&quot;:&quot;implementa\u00e7\u00e3o-did\u00e1tica-encoder-slip-em-c&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Decoder SLIP (lado cr\u00edtico)&quot;,&quot;value&quot;:&quot;decoder-slip-lado-cr\u00edtico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Onde o SLIP \u00e9 uma boa escolha&quot;,&quot;value&quot;:&quot;onde-o-slip-\u00e9-uma-boa-escolha&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Onde o SLIP \u00e9 uma m\u00e1 escolha (e por qu\u00ea)&quot;,&quot;value&quot;:&quot;onde-o-slip-\u00e9-uma-m\u00e1-escolha-e-por-qu\u00ea&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;value&quot;:&quot;conclus\u00e3o-parcial&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;COBS (Consistent Overhead Byte Stuffing): framing determin\u00edstico e recupera\u00e7\u00e3o real&quot;,&quot;value&quot;:&quot;cobs-consistent-overhead-byte-stuffing-framing-determin\u00edstico-e-recupera\u00e7\u00e3o-real&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Ideia central do COBS&quot;,&quot;value&quot;:&quot;ideia-central-do-cobs&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo conceitual&quot;,&quot;value&quot;:&quot;exemplo-conceitual&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Encoder COBS \u2014 implementa\u00e7\u00e3o did\u00e1tica em C&quot;,&quot;value&quot;:&quot;encoder-cobs-implementa\u00e7\u00e3o-did\u00e1tica-em-c&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Decoder COBS \u2014 recupera\u00e7\u00e3o previs\u00edvel&quot;,&quot;value&quot;:&quot;decoder-cobs-recupera\u00e7\u00e3o-previs\u00edvel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que COBS \u00e9 realmente auto-sincroniz\u00e1vel&quot;,&quot;value&quot;:&quot;por-que-cobs-\u00e9-realmente-auto-sincroniz\u00e1vel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boas e m\u00e1s escolhas com COBS&quot;,&quot;value&quot;:&quot;boas-e-m\u00e1s-escolhas-com-cobs&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o direta: SLIP \u00d7 COBS&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-direta-slip-\u00d7-cobs&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;value&quot;:&quot;conclus\u00e3o-parcial&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;CBOR (Concise Binary Object Representation): sem\u00e2ntica bin\u00e1ria n\u00e3o \u00e9 framing&quot;,&quot;value&quot;:&quot;cbor-concise-binary-object-representation-sem\u00e2ntica-bin\u00e1ria-n\u00e3o-\u00e9-framing&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que o CBOR realmente define&quot;,&quot;value&quot;:&quot;o-que-o-cbor-realmente-define&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo conceitual: CBOR vs JSON&quot;,&quot;value&quot;:&quot;exemplo-conceitual-cbor-vs-json&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erro cl\u00e1ssico: \u201cvou ler CBOR direto da UART\u201d&quot;,&quot;value&quot;:&quot;erro-cl\u00e1ssico-vou-ler-cbor-direto-da-uart&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Uso correto: CBOR como payload, COBS como transporte&quot;,&quot;value&quot;:&quot;uso-correto-cbor-como-payload-cobs-como-transporte&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo did\u00e1tico \u2014 gerando CBOR (C)&quot;,&quot;value&quot;:&quot;exemplo-did\u00e1tico-gerando-cbor-c&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Encapsulando CBOR com COBS&quot;,&quot;value&quot;:&quot;encapsulando-cbor-com-cobs&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boas e m\u00e1s escolhas com CBOR&quot;,&quot;value&quot;:&quot;boas-e-m\u00e1s-escolhas-com-cbor&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o direta: COBS \u00d7 CBOR&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-direta-cobs-\u00d7-cbor&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o parcial&quot;,&quot;value&quot;:&quot;conclus\u00e3o-parcial&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o geral, decis\u00f5es de projeto e checklist de boas pr\u00e1ticas&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-geral-decis\u00f5es-de-projeto-e-checklist-de-boas-pr\u00e1ticas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o t\u00e9cnica consolidada&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-t\u00e9cnica-consolidada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Arquiteturas t\u00edpicas (boas escolhas)&quot;,&quot;value&quot;:&quot;arquiteturas-t\u00edpicas-boas-escolhas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;M\u00e1s decis\u00f5es cl\u00e1ssicas (e por que falham)&quot;,&quot;value&quot;:&quot;m\u00e1s-decis\u00f5es-cl\u00e1ssicas-e-por-que-falham&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Checklist de boas pr\u00e1ticas (engenharia de firmware)&quot;,&quot;value&quot;:&quot;checklist-de-boas-pr\u00e1ticas-engenharia-de-firmware&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Regra pr\u00e1tica para n\u00e3o errar&quot;,&quot;value&quot;:&quot;regra-pr\u00e1tica-para-n\u00e3o-errar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o do artigo&quot;,&quot;value&quot;:&quot;conclus\u00e3o-do-artigo&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Conceito, motivação e panorama geral</a><li><a href="#eb-table-content-1">O que significa “auto-sincronização” na prática</a><li><a href="#eb-table-content-2">Visão geral dos protocolos que vamos estudar</a><li><a href="#eb-table-content-3">Boas e más decisões logo no início</a><li><a href="#eb-table-content-4">SLIP (Serial Line Internet Protocol): simplicidade que cobra seu preço</a><ul class="eb-toc__list"><li><a href="#como-o-slip-funciona-byte-a-byte">Como o SLIP funciona (byte a byte)</a><li><a href="#exemplo-conceitual-de-framing-slip">Exemplo conceitual de framing SLIP</a><li><a href="#eb-table-content-7">Implementação didática — Encoder SLIP em C</a><li><a href="#eb-table-content-8">Decoder SLIP (lado crítico)</a><li><a href="#eb-table-content-9">Onde o SLIP é uma boa escolha</a><li><a href="#eb-table-content-10">Onde o SLIP é uma má escolha (e por quê)</a><li><a href="#eb-table-content-11">Conclusão parcial</a></li></ul><li><a href="#eb-table-content-12">COBS (Consistent Overhead Byte Stuffing): framing determinístico e recuperação real</a><ul class="eb-toc__list"><li><a href="#ideia-central-do-cobs">Ideia central do COBS</a><li><a href="#exemplo-conceitual">Exemplo conceitual</a><li><a href="#eb-table-content-15">Encoder COBS — implementação didática em C</a><li><a href="#eb-table-content-16">Decoder COBS — recuperação previsível</a><li><a href="#eb-table-content-17">Por que COBS é realmente auto-sincronizável</a><li><a href="#eb-table-content-18">Boas e más escolhas com COBS</a><li><a href="#eb-table-content-19">Comparação direta: SLIP × COBS</a><li><a href="#eb-table-content-20">Conclusão parcial</a></li></ul><li><a href="#eb-table-content-21">CBOR (Concise Binary Object Representation): semântica binária não é framing</a><ul class="eb-toc__list"><li><a href="#o-que-o-cbor-realmente-define">O que o CBOR realmente define</a><li><a href="#exemplo-conceitual-cbor-vs-json">Exemplo conceitual: CBOR vs JSON</a><li><a href="#eb-table-content-24">Erro clássico: “vou ler CBOR direto da UART”</a><li><a href="#uso-correto-cbor-como-payload-cobs-como-transporte">Uso correto: CBOR como payload, COBS como transporte</a><li><a href="#eb-table-content-26">Exemplo didático — gerando CBOR (C)</a><li><a href="#encapsulando-cbor-com-cobs">Encapsulando CBOR com COBS</a><li><a href="#eb-table-content-28">Boas e más escolhas com CBOR</a><li><a href="#eb-table-content-29">Comparação direta: COBS × CBOR</a><li><a href="#eb-table-content-30">Conclusão parcial</a></li></ul><li><a href="#eb-table-content-31">Comparação geral, decisões de projeto e checklist de boas práticas</a><ul class="eb-toc__list"><li><a href="#eb-table-content-32">Comparação técnica consolidada</a><li><a href="#eb-table-content-33">Arquiteturas típicas (boas escolhas)</a><li><a href="#eb-table-content-34">Más decisões clássicas (e por que falham)</a><li><a href="#eb-table-content-35">Checklist de boas práticas (engenharia de firmware)</a><li><a href="#eb-table-content-36">Regra prática para não errar</a><li><a href="#eb-table-content-37">Conclusão do artigo</a></li></ul></ul></div></div></div></div></div>


<h3 class="wp-block-heading"><strong>Conceito, motivação e panorama geral</strong></h3>



<p class="wp-block-paragraph">Em sistemas embarcados reais, <strong>dados seriais não chegam “limpos”</strong>. Há ruído elétrico, bytes perdidos, reinicializações assíncronas, buffers cheios e tarefas concorrentes. Protocolos <strong>auto-sincronizáveis</strong> surgem exatamente para resolver esse cenário: eles permitem <strong>recuperar o alinhamento do fluxo</strong> mesmo quando o receptor começa a ler no meio de um pacote, sem depender de resets globais ou estados externos.</p>



<p class="wp-block-paragraph">Um protocolo é auto-sincronizável quando o receptor consegue, <strong>observando apenas o fluxo de bytes</strong>, reencontrar limites válidos de mensagem após erros. Isso contrasta com abordagens frágeis como “leia N bytes e confie”, que falham assim que um único byte se perde. Em UART, SPI em modo streaming, CDC-ACM, ou qualquer link byte-oriented, essa propriedade <strong>define se o sistema se recupera sozinho ou trava silenciosamente</strong>.</p>



<p class="wp-block-paragraph">Nesta série, vamos analisar três abordagens amplamente usadas — <strong>SLIP</strong>, <strong>COBS</strong> e <strong>CBOR</strong> — não como “formatos bonitos”, mas como <strong>decisões de engenharia</strong>. Vamos discutir <strong>o que cada uma garante</strong>, <strong>o que não garante</strong>, <strong>onde usar</strong>, <strong>onde evitar</strong>, e <strong>como implementar corretamente</strong> em firmware de produção.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">O que significa “auto-sincronização” na prática</h3>



<p class="wp-block-paragraph">Do ponto de vista do firmware, auto-sincronização implica três capacidades essenciais:</p>



<ol class="wp-block-list">
<li><strong>Delimitação inequívoca</strong><br>O receptor precisa identificar onde uma mensagem começa e termina, mesmo após bytes inválidos.</li>



<li><strong>Recuperação após erro</strong><br>Um erro local (byte perdido, extra, corrompido) <strong>não pode invalidar todo o fluxo</strong>.</li>



<li><strong>Parsing incremental (streaming)</strong><br>O protocolo deve permitir processamento byte-a-byte, sem exigir buffers gigantes ou leituras bloqueantes.</li>
</ol>



<p class="wp-block-paragraph">SLIP, COBS e CBOR resolvem esses pontos de formas <strong>fundamentalmente diferentes</strong>, e entender essas diferenças é o que separa firmware de laboratório de firmware industrial.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Visão geral dos protocolos que vamos estudar</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Protocolo</th><th>Natureza</th><th>Resolve framing</th><th>Auto-sincroniza</th><th>Detecta erro</th><th>Uso típico</th></tr></thead><tbody><tr><td><strong>SLIP</strong></td><td>Delimitador + escape</td><td>Parcial</td><td>Fraca</td><td>Não</td><td>Debug simples, legado</td></tr><tr><td><strong>COBS</strong></td><td>Codificação de comprimento</td><td>Forte</td><td>Forte</td><td>Não</td><td>UART robusta, SPI streaming</td></tr><tr><td><strong>CBOR</strong></td><td>Serialização binária estruturada</td><td>Não (sozinho)</td><td>Parcial</td><td>Opcional</td><td>RPC, IoT, payload semântico</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Um erro comum é tratar <strong>CBOR como protocolo de transporte</strong> — ele <strong>não é</strong>. CBOR define <strong>como os dados são codificados</strong>, não <strong>como são enquadrados</strong> no fluxo. Por isso, em sistemas bem projetados, CBOR quase sempre aparece <strong>sobre</strong> COBS ou outro método de framing.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">Boas e más decisões logo no início</h3>



<p class="wp-block-paragraph"><strong>Boas escolhas</strong></p>



<ul class="wp-block-list">
<li>Pensar em framing <strong>antes</strong> de escrever o parser</li>



<li>Separar claramente: <em>transporte</em> × <em>serialização</em></li>



<li>Assumir que bytes <strong>serão perdidos</strong> em algum momento</li>
</ul>



<p class="wp-block-paragraph"><strong>Más escolhas</strong></p>



<ul class="wp-block-list">
<li>Usar <code>scanf()</code> ou parsing por strings</li>



<li>Depender de timeouts para “adivinhar” fim de pacote</li>



<li>Achar que CRC substitui framing (não substitui)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/protoclos/uart-serial/protocolos-auto-sincronizaveis-em-sistemas-embarcados/">Protocolos auto-sincronizáveis em sistemas embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1108</post-id>	</item>
		<item>
		<title>UART não é Porta Serial: Como Projetar Protocolos Robustos em Sistemas Embarcados</title>
		<link>https://mcu.tec.br/protoclos/uart-serial/uart-nao-e-porta-serial-como-projetar-protocolos-robustos-em-sistemas-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=uart-nao-e-porta-serial-como-projetar-protocolos-robustos-em-sistemas-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sun, 04 Jan 2026 00:42:48 +0000</pubDate>
				<category><![CDATA[UART (Serial)]]></category>
		<category><![CDATA[buffer UART]]></category>
		<category><![CDATA[comunicação embarcada]]></category>
		<category><![CDATA[comunicação serial]]></category>
		<category><![CDATA[CRC em UART]]></category>
		<category><![CDATA[engenharia de firmware]]></category>
		<category><![CDATA[firmware robusto]]></category>
		<category><![CDATA[framing UART]]></category>
		<category><![CDATA[FreeRTOS UART]]></category>
		<category><![CDATA[parsing defensivo]]></category>
		<category><![CDATA[protocolo UART]]></category>
		<category><![CDATA[protocolos binários]]></category>
		<category><![CDATA[ring buffer UART]]></category>
		<category><![CDATA[sistemas distribuídos embarcados]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[UART]]></category>
		<category><![CDATA[USART]]></category>
		<category><![CDATA[Zephyr UART]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1102</guid>

					<description><![CDATA[<p>UART é frequentemente tratada como uma simples porta serial para uso com printf e terminais, mas essa abordagem falha rapidamente em sistemas embarcados reais. Este artigo apresenta uma visão técnica e madura sobre UART como uma decisão de arquitetura, não como um periférico trivial. Ao longo do texto, discutimos bufferização correta, framing explícito, detecção de início de quadro, validação de integridade com CRC, parsing defensivo, recuperação de erros, perda de pacotes e re-sincronização. Com exemplos práticos em C comparando abordagens erradas e corretas, o artigo mostra como transformar UART em uma verdadeira camada de transporte para sistemas distribuídos embarcados, usados em ambientes industriais, robóticos e médicos. Ideal para engenheiros que desejam sair do nível de demos e construir firmware robusto, previsível e confiável para operação contínua em campo.</p>
<p>The post <a href="https://mcu.tec.br/protoclos/uart-serial/uart-nao-e-porta-serial-como-projetar-protocolos-robustos-em-sistemas-embarcados/">UART não é Porta Serial: Como Projetar Protocolos Robustos em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-p8biy wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-p8biy "><div class="eb-toc-container eb-toc-p8biy  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:2,&quot;content&quot;:&quot;UART n\u00e3o \u00e9 uma porta: \u00e9 uma decis\u00e3o de arquitetura&quot;,&quot;text&quot;:&quot;UART n\u00e3o \u00e9 uma porta: \u00e9 uma decis\u00e3o de arquitetura&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O erro cl\u00e1ssico: UART como \u201clinha de printf\u201d&quot;,&quot;text&quot;:&quot;O erro cl\u00e1ssico: UART como \u201clinha de printf\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;A mudan\u00e7a de mentalidade: UART como canal bruto&quot;,&quot;text&quot;:&quot;A mudan\u00e7a de mentalidade: UART como canal bruto&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;UART como espelho do engenheiro&quot;,&quot;text&quot;:&quot;UART como espelho do engenheiro&quot;,&quot;link&quot;:&quot;uart-como-espelho-do-engenheiro&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Bufferiza\u00e7\u00e3o n\u00e3o \u00e9 opcional: \u00e9 o primeiro contrato com a realidade&quot;,&quot;text&quot;:&quot;Bufferiza\u00e7\u00e3o n\u00e3o \u00e9 opcional: \u00e9 o primeiro contrato com a realidade&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O erro cl\u00e1ssico: processar dados no contexto da interrup\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;O erro cl\u00e1ssico: processar dados no contexto da interrup\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;A abordagem correta: ISR m\u00ednima + buffer expl\u00edcito&quot;,&quot;text&quot;:&quot;A abordagem correta: ISR m\u00ednima + buffer expl\u00edcito&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Consumir bytes \u00e9 diferente de interpretar mensagens&quot;,&quot;text&quot;:&quot;Consumir bytes \u00e9 diferente de interpretar mensagens&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Bufferiza\u00e7\u00e3o como base para escalabilidade&quot;,&quot;text&quot;:&quot;Bufferiza\u00e7\u00e3o como base para escalabilidade&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Um crit\u00e9rio simples de maturidade&quot;,&quot;text&quot;:&quot;Um crit\u00e9rio simples de maturidade&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Framing: bytes sem fronteiras n\u00e3o s\u00e3o mensagens&quot;,&quot;text&quot;:&quot;Framing: bytes sem fronteiras n\u00e3o s\u00e3o mensagens&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O erro cl\u00e1ssico: confiar em delimitadores \u201chumanos\u201d&quot;,&quot;text&quot;:&quot;O erro cl\u00e1ssico: confiar em delimitadores \u201chumanos\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Framing \u00e9 uma decis\u00e3o de protocolo, n\u00e3o de conveni\u00eancia&quot;,&quot;text&quot;:&quot;Framing \u00e9 uma decis\u00e3o de protocolo, n\u00e3o de conveni\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Abordagem correta 1: marcador de in\u00edcio + comprimento&quot;,&quot;text&quot;:&quot;Abordagem correta 1: marcador de in\u00edcio + comprimento&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Abordagem correta 2: delimitador com escape (SLIP-like)&quot;,&quot;text&quot;:&quot;Abordagem correta 2: delimitador com escape (SLIP-like)&quot;,&quot;link&quot;:&quot;abordagem-correta-2-delimitador-com-escape-slip-like&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Framing define se o sistema sobrevive ao erro&quot;,&quot;text&quot;:&quot;Framing define se o sistema sobrevive ao erro&quot;,&quot;link&quot;:&quot;framing-define-se-o-sistema-sobrevive-ao-erro&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Uma regra pr\u00e1tica&quot;,&quot;text&quot;:&quot;Uma regra pr\u00e1tica&quot;,&quot;link&quot;:&quot;eb-table-content-16&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Integridade e parsing defensivo: confiar em bytes \u00e9 ingenuidade&quot;,&quot;text&quot;:&quot;Integridade e parsing defensivo: confiar em bytes \u00e9 ingenuidade&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O erro cl\u00e1ssico: \u201cse chegou, \u00e9 v\u00e1lido\u201d&quot;,&quot;text&quot;:&quot;O erro cl\u00e1ssico: \u201cse chegou, \u00e9 v\u00e1lido\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Integridade n\u00e3o \u00e9 luxo, \u00e9 requisito&quot;,&quot;text&quot;:&quot;Integridade n\u00e3o \u00e9 luxo, \u00e9 requisito&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo correto: CRC expl\u00edcito no frame&quot;,&quot;text&quot;:&quot;Exemplo correto: CRC expl\u00edcito no frame&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Parsing defensivo: nunca confie no emissor&quot;,&quot;text&quot;:&quot;Parsing defensivo: nunca confie no emissor&quot;,&quot;link&quot;:&quot;parsing-defensivo-nunca-confie-no-emissor&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;UART como superf\u00edcie de ataque (mesmo sem rede)&quot;,&quot;text&quot;:&quot;UART como superf\u00edcie de ataque (mesmo sem rede)&quot;,&quot;link&quot;:&quot;eb-table-content-22&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Regra de ouro&quot;,&quot;text&quot;:&quot;Regra de ouro&quot;,&quot;link&quot;:&quot;regra-de-ouro&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Recupera\u00e7\u00e3o, perda e por que sistemas reais n\u00e3o assumem perfei\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Recupera\u00e7\u00e3o, perda e por que sistemas reais n\u00e3o assumem perfei\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O erro cl\u00e1ssico: assumir que \u201cn\u00e3o acontece\u201d&quot;,&quot;text&quot;:&quot;O erro cl\u00e1ssico: assumir que \u201cn\u00e3o acontece\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Sistemas reais assumem falha como condi\u00e7\u00e3o normal&quot;,&quot;text&quot;:&quot;Sistemas reais assumem falha como condi\u00e7\u00e3o normal&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Timeouts: o rel\u00f3gio tamb\u00e9m \u00e9 parte do protocolo&quot;,&quot;text&quot;:&quot;Timeouts: o rel\u00f3gio tamb\u00e9m \u00e9 parte do protocolo&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Re-sincroniza\u00e7\u00e3o expl\u00edcita&quot;,&quot;text&quot;:&quot;Re-sincroniza\u00e7\u00e3o expl\u00edcita&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Perda de pacotes n\u00e3o \u00e9 exce\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Perda de pacotes n\u00e3o \u00e9 exce\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;UART como transporte muda o jogo&quot;,&quot;text&quot;:&quot;UART como transporte muda o jogo&quot;,&quot;link&quot;:&quot;uart-como-transporte-muda-o-jogo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;A frase que resume tudo&quot;,&quot;text&quot;:&quot;A frase que resume tudo&quot;,&quot;link&quot;:&quot;a-frase-que-resume-tudo&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Checklist de Boas Pr\u00e1ticas \u2014 UART como Camada de Transporte&quot;,&quot;text&quot;:&quot;Checklist de Boas Pr\u00e1ticas \u2014 UART como Camada de Transporte&quot;,&quot;link&quot;:&quot;eb-table-content-32&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1. Modelo Mental e Arquitetura&quot;,&quot;text&quot;:&quot;1. Modelo Mental e Arquitetura&quot;,&quot;link&quot;:&quot;1-modelo-mental-e-arquitetura&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;2. Interrup\u00e7\u00f5es (ISR)&quot;,&quot;text&quot;:&quot;2. Interrup\u00e7\u00f5es (ISR)&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;3. Bufferiza\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;3. Bufferiza\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;4. Framing&quot;,&quot;text&quot;:&quot;4. Framing&quot;,&quot;link&quot;:&quot;4-framing&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;5. Integridade&quot;,&quot;text&quot;:&quot;5. Integridade&quot;,&quot;link&quot;:&quot;5-integridade&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;6. Parsing Defensivo&quot;,&quot;text&quot;:&quot;6. Parsing Defensivo&quot;,&quot;link&quot;:&quot;6-parsing-defensivo&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;7. Recupera\u00e7\u00e3o e Robustez&quot;,&quot;text&quot;:&quot;7. Recupera\u00e7\u00e3o e Robustez&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;8. Perda, Repeti\u00e7\u00e3o e Ordem&quot;,&quot;text&quot;:&quot;8. Perda, Repeti\u00e7\u00e3o e Ordem&quot;,&quot;link&quot;:&quot;eb-table-content-40&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;9. Tempo e Determinismo&quot;,&quot;text&quot;:&quot;9. Tempo e Determinismo&quot;,&quot;link&quot;:&quot;9-tempo-e-determinismo&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;10. Seguran\u00e7a e Confiabilidade&quot;,&quot;text&quot;:&quot;10. Seguran\u00e7a e Confiabilidade&quot;,&quot;link&quot;:&quot;eb-table-content-42&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;11. Testabilidade&quot;,&quot;text&quot;:&quot;11. Testabilidade&quot;,&quot;link&quot;:&quot;11-testabilidade&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;12. Maturidade do Sistema&quot;,&quot;text&quot;:&quot;12. Maturidade do Sistema&quot;,&quot;link&quot;:&quot;12-maturidade-do-sistema&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Regra Final&quot;,&quot;text&quot;:&quot;Regra Final&quot;,&quot;link&quot;:&quot;regra-final&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;UART n\u00e3o \u00e9 uma porta: \u00e9 uma decis\u00e3o de arquitetura&quot;,&quot;value&quot;:&quot;uart-n\u00e3o-\u00e9-uma-porta-\u00e9-uma-decis\u00e3o-de-arquitetura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O erro cl\u00e1ssico: UART como \u201clinha de printf\u201d&quot;,&quot;value&quot;:&quot;o-erro-cl\u00e1ssico-uart-como-linha-de-printf&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;A mudan\u00e7a de mentalidade: UART como canal bruto&quot;,&quot;value&quot;:&quot;a-mudan\u00e7a-de-mentalidade-uart-como-canal-bruto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;UART como espelho do engenheiro&quot;,&quot;value&quot;:&quot;uart-como-espelho-do-engenheiro&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Bufferiza\u00e7\u00e3o n\u00e3o \u00e9 opcional: \u00e9 o primeiro contrato com a realidade&quot;,&quot;value&quot;:&quot;bufferiza\u00e7\u00e3o-n\u00e3o-\u00e9-opcional-\u00e9-o-primeiro-contrato-com-a-realidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O erro cl\u00e1ssico: processar dados no contexto da interrup\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;o-erro-cl\u00e1ssico-processar-dados-no-contexto-da-interrup\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;A abordagem correta: ISR m\u00ednima + buffer expl\u00edcito&quot;,&quot;value&quot;:&quot;a-abordagem-correta-isr-m\u00ednima-buffer-expl\u00edcito&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Consumir bytes \u00e9 diferente de interpretar mensagens&quot;,&quot;value&quot;:&quot;consumir-bytes-\u00e9-diferente-de-interpretar-mensagens&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Bufferiza\u00e7\u00e3o como base para escalabilidade&quot;,&quot;value&quot;:&quot;bufferiza\u00e7\u00e3o-como-base-para-escalabilidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Um crit\u00e9rio simples de maturidade&quot;,&quot;value&quot;:&quot;um-crit\u00e9rio-simples-de-maturidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Framing: bytes sem fronteiras n\u00e3o s\u00e3o mensagens&quot;,&quot;value&quot;:&quot;framing-bytes-sem-fronteiras-n\u00e3o-s\u00e3o-mensagens&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O erro cl\u00e1ssico: confiar em delimitadores \u201chumanos\u201d&quot;,&quot;value&quot;:&quot;o-erro-cl\u00e1ssico-confiar-em-delimitadores-humanos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Framing \u00e9 uma decis\u00e3o de protocolo, n\u00e3o de conveni\u00eancia&quot;,&quot;value&quot;:&quot;framing-\u00e9-uma-decis\u00e3o-de-protocolo-n\u00e3o-de-conveni\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Abordagem correta 1: marcador de in\u00edcio + comprimento&quot;,&quot;value&quot;:&quot;abordagem-correta-1-marcador-de-in\u00edcio-comprimento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Abordagem correta 2: delimitador com escape (SLIP-like)&quot;,&quot;value&quot;:&quot;abordagem-correta-2-delimitador-com-escape-slip-like&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Framing define se o sistema sobrevive ao erro&quot;,&quot;value&quot;:&quot;framing-define-se-o-sistema-sobrevive-ao-erro&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Uma regra pr\u00e1tica&quot;,&quot;value&quot;:&quot;uma-regra-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Integridade e parsing defensivo: confiar em bytes \u00e9 ingenuidade&quot;,&quot;value&quot;:&quot;integridade-e-parsing-defensivo-confiar-em-bytes-\u00e9-ingenuidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O erro cl\u00e1ssico: \u201cse chegou, \u00e9 v\u00e1lido\u201d&quot;,&quot;value&quot;:&quot;o-erro-cl\u00e1ssico-se-chegou-\u00e9-v\u00e1lido&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Integridade n\u00e3o \u00e9 luxo, \u00e9 requisito&quot;,&quot;value&quot;:&quot;integridade-n\u00e3o-\u00e9-luxo-\u00e9-requisito&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo correto: CRC expl\u00edcito no frame&quot;,&quot;value&quot;:&quot;exemplo-correto-crc-expl\u00edcito-no-frame&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Parsing defensivo: nunca confie no emissor&quot;,&quot;value&quot;:&quot;parsing-defensivo-nunca-confie-no-emissor&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;UART como superf\u00edcie de ataque (mesmo sem rede)&quot;,&quot;value&quot;:&quot;uart-como-superf\u00edcie-de-ataque-mesmo-sem-rede&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Regra de ouro&quot;,&quot;value&quot;:&quot;regra-de-ouro&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Recupera\u00e7\u00e3o, perda e por que sistemas reais n\u00e3o assumem perfei\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;recupera\u00e7\u00e3o-perda-e-por-que-sistemas-reais-n\u00e3o-assumem-perfei\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O erro cl\u00e1ssico: assumir que \u201cn\u00e3o acontece\u201d&quot;,&quot;value&quot;:&quot;o-erro-cl\u00e1ssico-assumir-que-n\u00e3o-acontece&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sistemas reais assumem falha como condi\u00e7\u00e3o normal&quot;,&quot;value&quot;:&quot;sistemas-reais-assumem-falha-como-condi\u00e7\u00e3o-normal&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Timeouts: o rel\u00f3gio tamb\u00e9m \u00e9 parte do protocolo&quot;,&quot;value&quot;:&quot;timeouts-o-rel\u00f3gio-tamb\u00e9m-\u00e9-parte-do-protocolo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Re-sincroniza\u00e7\u00e3o expl\u00edcita&quot;,&quot;value&quot;:&quot;re-sincroniza\u00e7\u00e3o-expl\u00edcita&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Perda de pacotes n\u00e3o \u00e9 exce\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;perda-de-pacotes-n\u00e3o-\u00e9-exce\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;UART como transporte muda o jogo&quot;,&quot;value&quot;:&quot;uart-como-transporte-muda-o-jogo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;A frase que resume tudo&quot;,&quot;value&quot;:&quot;a-frase-que-resume-tudo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Checklist de Boas Pr\u00e1ticas \u2014 UART como Camada de Transporte&quot;,&quot;value&quot;:&quot;checklist-de-boas-pr\u00e1ticas-uart-como-camada-de-transporte&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1. Modelo Mental e Arquitetura&quot;,&quot;value&quot;:&quot;1-modelo-mental-e-arquitetura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2. Interrup\u00e7\u00f5es (ISR)&quot;,&quot;value&quot;:&quot;2-interrup\u00e7\u00f5es-isr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3. Bufferiza\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;3-bufferiza\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4. Framing&quot;,&quot;value&quot;:&quot;4-framing&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5. Integridade&quot;,&quot;value&quot;:&quot;5-integridade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6. Parsing Defensivo&quot;,&quot;value&quot;:&quot;6-parsing-defensivo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7. Recupera\u00e7\u00e3o e Robustez&quot;,&quot;value&quot;:&quot;7-recupera\u00e7\u00e3o-e-robustez&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8. Perda, Repeti\u00e7\u00e3o e Ordem&quot;,&quot;value&quot;:&quot;8-perda-repeti\u00e7\u00e3o-e-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;9. Tempo e Determinismo&quot;,&quot;value&quot;:&quot;9-tempo-e-determinismo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;10. Seguran\u00e7a e Confiabilidade&quot;,&quot;value&quot;:&quot;10-seguran\u00e7a-e-confiabilidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;11. Testabilidade&quot;,&quot;value&quot;:&quot;11-testabilidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;12. Maturidade do Sistema&quot;,&quot;value&quot;:&quot;12-maturidade-do-sistema&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Regra Final&quot;,&quot;value&quot;:&quot;regra-final&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">UART não é uma porta: é uma decisão de arquitetura</a><ul class="eb-toc__list"><li><a href="#eb-table-content-1">O erro clássico: UART como “linha de printf”</a><li><a href="#eb-table-content-2">A mudança de mentalidade: UART como canal bruto</a><li><a href="#uart-como-espelho-do-engenheiro">UART como espelho do engenheiro</a></li></ul><li><a href="#eb-table-content-4">Bufferização não é opcional: é o primeiro contrato com a realidade</a><ul class="eb-toc__list"><li><a href="#eb-table-content-5">O erro clássico: processar dados no contexto da interrupção</a><li><a href="#eb-table-content-6">A abordagem correta: ISR mínima + buffer explícito</a><li><a href="#eb-table-content-7">Consumir bytes é diferente de interpretar mensagens</a><li><a href="#eb-table-content-8">Bufferização como base para escalabilidade</a><li><a href="#eb-table-content-9">Um critério simples de maturidade</a></li></ul><li><a href="#eb-table-content-10">Framing: bytes sem fronteiras não são mensagens</a><ul class="eb-toc__list"><li><a href="#eb-table-content-11">O erro clássico: confiar em delimitadores “humanos”</a><li><a href="#eb-table-content-12">Framing é uma decisão de protocolo, não de conveniência</a><li><a href="#eb-table-content-13">Abordagem correta 1: marcador de início + comprimento</a><li><a href="#abordagem-correta-2-delimitador-com-escape-slip-like">Abordagem correta 2: delimitador com escape (SLIP-like)</a><li><a href="#framing-define-se-o-sistema-sobrevive-ao-erro">Framing define se o sistema sobrevive ao erro</a><li><a href="#eb-table-content-16">Uma regra prática</a></li></ul><li><a href="#eb-table-content-17">Integridade e parsing defensivo: confiar em bytes é ingenuidade</a><ul class="eb-toc__list"><li><a href="#eb-table-content-18">O erro clássico: “se chegou, é válido”</a><li><a href="#eb-table-content-19">Integridade não é luxo, é requisito</a><li><a href="#eb-table-content-20">Exemplo correto: CRC explícito no frame</a><li><a href="#parsing-defensivo-nunca-confie-no-emissor">Parsing defensivo: nunca confie no emissor</a><li><a href="#eb-table-content-22">UART como superfície de ataque (mesmo sem rede)</a><li><a href="#regra-de-ouro">Regra de ouro</a></li></ul><li><a href="#eb-table-content-24">Recuperação, perda e por que sistemas reais não assumem perfeição</a><ul class="eb-toc__list"><li><a href="#eb-table-content-25">O erro clássico: assumir que “não acontece”</a><li><a href="#eb-table-content-26">Sistemas reais assumem falha como condição normal</a><li><a href="#eb-table-content-27">Timeouts: o relógio também é parte do protocolo</a><li><a href="#eb-table-content-28">Re-sincronização explícita</a><li><a href="#eb-table-content-29">Perda de pacotes não é exceção</a><li><a href="#uart-como-transporte-muda-o-jogo">UART como transporte muda o jogo</a><li><a href="#a-frase-que-resume-tudo">A frase que resume tudo</a></li></ul><li><a href="#eb-table-content-32">Checklist de Boas Práticas — UART como Camada de Transporte</a><ul class="eb-toc__list"><li><a href="#1-modelo-mental-e-arquitetura">1. Modelo Mental e Arquitetura</a><li><a href="#eb-table-content-34">2. Interrupções (ISR)</a><li><a href="#eb-table-content-35">3. Bufferização</a><li><a href="#4-framing">4. Framing</a><li><a href="#5-integridade">5. Integridade</a><li><a href="#6-parsing-defensivo">6. Parsing Defensivo</a><li><a href="#eb-table-content-39">7. Recuperação e Robustez</a><li><a href="#eb-table-content-40">8. Perda, Repetição e Ordem</a><li><a href="#9-tempo-e-determinismo">9. Tempo e Determinismo</a><li><a href="#eb-table-content-42">10. Segurança e Confiabilidade</a><li><a href="#11-testabilidade">11. Testabilidade</a><li><a href="#12-maturidade-do-sistema">12. Maturidade do Sistema</a><li><a href="#regra-final">Regra Final</a></li></ul></ul></div></div></div></div></div>


<h2 class="wp-block-heading"><strong>UART não é uma porta: é uma decisão de arquitetura</strong></h2>



<p class="wp-block-paragraph">Para a maioria dos engenheiros, o primeiro contato com um microcontrolador envolve ligar um conversor USB-UART, abrir um terminal serial e enviar caracteres. Essa experiência inicial cria um vício conceitual perigoso: tratar UART como se fosse uma “porta de texto”, algo próximo de um <code>printf()</code> com fio. Esse modelo mental funciona em <em>demos</em>, <em>provas de conceito</em> e exemplos de datasheet — mas ele quebra imediatamente quando o sistema passa a existir no mundo real.</p>



<p class="wp-block-paragraph">UART não é uma porta, não é um periférico isolado e definitivamente não é um canal confiável por definição. UART é apenas um <strong>mecanismo físico de serialização de bits</strong>, sem noção de mensagens, pacotes, estados, erros ou intenção semântica. Tudo o que faz sentido — início, fim, significado, validade, recuperação — <strong>precisa ser projetado em cima dela</strong>. Quando isso não é feito, o sistema não “falha de vez”; ele falha de forma intermitente, imprevisível e difícil de depurar.</p>



<p class="wp-block-paragraph">Um teste simples revela rapidamente o nível de maturidade de um firmware: <em>o que acontece quando um byte se perde?</em> Se a resposta for “nunca acontece” ou “o terminal não mostra”, o sistema já está arquiteturalmente comprometido. Em sistemas reais há ruído elétrico, interrupções concorrentes, buffers cheios, clocks ligeiramente desalinhados, resets parciais e firmware sendo atualizado em campo. UART expõe todas essas fragilidades sem piedade.</p>



<h3 class="wp-block-heading">O erro clássico: UART como “linha de printf”</h3>



<p class="wp-block-paragraph">O padrão mais comum — e mais frágil — de uso de UART é este:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Abordagem frágil e não determinística
void loop(void) {
    char cmd&#91;32&#93;;
    scanf("%s", cmd);

    if (strcmp(cmd, "ON") == 0) {
        led_on();
    } else if (strcmp(cmd, "OFF") == 0) {
        led_off();
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">// &#x274c; Abordagem frágil e não determinística</span></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">loop</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cmd</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">32</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">scanf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">%s</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cmd</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #88C0D0">strcmp</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">cmd</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ON</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">led_on</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #88C0D0">strcmp</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">cmd</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">OFF</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">led_off</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse código pressupõe coisas que <strong>não são garantidas pela UART</strong>:</p>



<ul class="wp-block-list">
<li>Que os dados chegam completos</li>



<li>Que não há bytes extras ou truncados</li>



<li>Que o buffer nunca estoura</li>



<li>Que o alinhamento entre transmissor e receptor é perfeito</li>



<li>Que ruído não existe</li>



<li>Que o tempo não importa</li>
</ul>



<p class="wp-block-paragraph">Além disso, <code>scanf()</code> bloqueia a execução, mistura parsing com transporte, não detecta framing e não oferece nenhuma estratégia de recuperação. Funciona em bancada, falha em produção.</p>



<h3 class="wp-block-heading">A mudança de mentalidade: UART como <em>canal bruto</em></h3>



<p class="wp-block-paragraph">Um sistema robusto parte do princípio oposto:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>UART não transporta comandos, transporta bytes.<br>Quem transporta mensagens é o protocolo que você desenha.</strong></p>
</blockquote>



<p class="wp-block-paragraph">Isso muda completamente a arquitetura. Em vez de “ler comandos”, o firmware passa a:</p>



<ol class="wp-block-list">
<li><strong>Receber bytes de forma assíncrona</strong></li>



<li><strong>Bufferizar dados</strong></li>



<li><strong>Detectar início e fim de quadros</strong></li>



<li><strong>Validar integridade</strong></li>



<li><strong>Interpretar significado</strong></li>



<li><strong>Responder ou recuperar estado</strong></li>
</ol>



<p class="wp-block-paragraph">Um primeiro passo correto é separar <strong>recepção</strong> de <strong>interpretação</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> UART tratada como stream bruto
#define RX_BUFFER_SIZE 128

volatile uint8_t rx_buffer&#91;RX_BUFFER_SIZE&#93;;
volatile uint16_t rx_head = 0;

void USART_IRQHandler(void) {
    uint8_t byte = USART_ReadByte();
    rx_buffer&#91;rx_head++&#93; = byte;
    rx_head %= RX_BUFFER_SIZE;
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">// &#x2705; UART tratada como stream bruto</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">RX_BUFFER_SIZE</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">128</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">volatile</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rx_buffer</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">RX_BUFFER_SIZE</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">volatile</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rx_head</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">USART_IRQHandler</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">byte</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">USART_ReadByte</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">rx_buffer</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">rx_head</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">byte</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">rx_head</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">%=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">RX_BUFFER_SIZE</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Aqui não há “comandos”, apenas <strong>dados crus entrando no sistema</strong>. Isso é proposital. O firmware assume que os bytes podem estar incompletos, desalinhados ou corrompidos — e projeta em cima disso.</p>



<p class="wp-block-paragraph">A partir desse ponto, tudo o que vier depois — framing, parsing, validação — deixa de ser improviso e passa a ser <strong>engenharia deliberada</strong>.</p>



<h3 class="wp-block-heading">UART como espelho do engenheiro</h3>



<p class="wp-block-paragraph">UART é brutal porque ela não esconde nada. Não há retransmissão automática, não há ordenação garantida, não há controle de fluxo implícito. Se o sistema funciona bem sobre UART, ele provavelmente funcionará bem sobre SPI, CAN, RS-485, TCP ou rádio. Se ele só funciona quando tudo dá certo, então ele não funciona.</p>



<p class="wp-block-paragraph">Projetar bem sobre UART é um divisor de águas. É o ponto em que o engenheiro deixa de “fazer firmware” e começa a <strong>construir sistemas distribuídos embarcados</strong>, capazes de sobreviver ao mundo real.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/protoclos/uart-serial/uart-nao-e-porta-serial-como-projetar-protocolos-robustos-em-sistemas-embarcados/">UART não é Porta Serial: Como Projetar Protocolos Robustos em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1102</post-id>	</item>
	</channel>
</rss>
