Think about the "OSI Seven Layer model" in order to answer what a "protocol" is, where "UART" (vs. USART) is related to it.
UART is a layer 1 or 2: it just defines how to send bits, better a SINGLE byte. It is more a physical layer, e.g. to have a start bit, serials bits of a byte, a stop bit. Even UART does not define the real physical layer, e.g. if it is a V24 interface (-15V/+15V logic), RS232 (-5V/+5V logic) or even running with 3V3 digital logic (TTL-UART). Often, UART in MCU context means just: an ASYNCHRONOUS bit stream, up to 8...9 bits, with start and stop bit, based on 3V3 logic level for an MCU pin.
BTW: UART and USART are not really the same!
When you see an 'S' in name, it stands often for "synchronous". So, it tells you: there is also the clock provided. In an "asynchronous" interface: there is not a clock provided: it is assumed that sender and receiver have their own clock reference, trying to get the bits with their own clocks, with the risk that the clocks drift away and the bits are getting wrong. Therefore UART is limited to send just bursts of 8..9 data bits (BYTE plus parity), where the START_BIT tells receiver when to start fetching the bits with a free running clock. After a longer period - the clock would drift off so much that bits are not correct anymore.
Compare with SPI which is a synchronous interface (it has an SCLK signal!).
A "synchronous" interface, where the reference clock is provided - can transmit much faster, many more bits over a longer period of time, w/o to lose "synchronization" when to capture a bit. An "asynchronous" interface cannot be sure how accurate and "stable" the local reference clock is w/o to get bit errors after a while. Therefore, an "asynchronous" interface starts all the time again with a "sync bit" (or word), which is here the START_BIT.
When it comes to protocol, these are the higher layers: compare with TCP/IP. It is based on ETH (the physical layer) and the higher layers (IP and than TCP) define how to interpret the bits (or bytes) received by the physical layer. Now it comes to layers where a data packet is "interpreted" (decoded/encoded) in order to understand what the message was.
UART is not a protocol: UART is a physical interface. It is able to send a number of bits, mainly ONE SINGLE BYTE at a time. How do you interpret the sequence of bytes - this is your protocol.
You can use UART in order to send ASCII characters (often used as "UART", e.g. a terminal) but you can also send real 8bit bytes. How do you interpret such bytes - it is your protocol, e.g. acting on 0xA, 0xD as Line Feed, Carriage Return or on CTRL-Q/CTRL-S for SW flow control (start/stop) is part of your protocol.
E.g. do you want to send text strings or code bytes? And how do you want to display characters (language, character set)? This is your protocol.
A protocol is in general:
- a definition about the byte sequence expected and how to decode (encode) it
- the flow control (handshaking), e.g. a "ping-ping", when you receive something - respond with something
- how to interpret a "string", e.g. as a value, as a name, as a command and how a value is encoded (e.g. LITTLE vs. BIG ENDIAN).
UART is just a physical interface, whereby the confusion comes when we talk about RS232, with TTL-Level, with V24 level, with MCU 3V3 voltage level. UART itself "guarantees" just to send and receive a SINGLE byte, nothing else (no interpretation = no protocol).
The protocol is "yours", e.g. TELNET, KERMIT, DFU ... - it is above the UART layer. It is the upper layer in your software/firmware (how to "understand" the bytes and what to do, e.g. how to respond, to take it as text or as code bytes for memory = firmware downloader).


