<?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>framing UART - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/framing-uart/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Wed, 07 Jan 2026 00:43:43 +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>framing UART - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>
