Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 2759262

Browse files
Merge pull request #2374 from arduino/Pedromsousalima/micropython/UART
[PXCT-490] Added UART
2 parents 5718f78 + 09d0b52 commit 2759262

File tree

3 files changed

+163
-0
lines changed

3 files changed

+163
-0
lines changed
197 KB
Loading[フレーム]
656 KB
Loading[フレーム]
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
---
2+
title: Serial communication (UART)
3+
description: Learn how to use UART with Micropython
4+
author: Pedro Sousa Lima
5+
---
6+
7+
Universal Asynchronous Receiver-Transmitter, or **UART**, is one of the simplest and most widely used communication protocols for connecting devices. It enables point-to-point communication over just two wires, making it a perfect fit for debugging, logging, and connecting to peripheral devices.
8+
9+
## How UART Works
10+
11+
UART communication relies on:
12+
- **TX (Transmit):** Sends data from one device to another.
13+
- **RX (Receive):** Receives data from the transmitting device.
14+
15+
Unlike other protocols like I2C or SPI, UART is asynchronous, meaning it doesn’t use a clock line. Instead, the sender and receiver agree on a common data rate (baud rate), such as 9600 bits per second.
16+
17+
Each device directly connects TX to RX and RX to TX.
18+
### Key Features of UART
19+
20+
1. **Simple Point-to-Point Communication:** Ideal for connecting two devices.
21+
2. **Flexible Speeds:** Baud rates can be adjusted to meet application needs.
22+
3. **Independent Lines:** TX and RX operate independently, enabling bidirectional communication.
23+
24+
## How to Read the Output
25+
26+
To observe the output of your UART communication, you’ll need a secondary board (or a USB-to-UART adapter) to act as a receiver. Here’s how you can set it up:
27+
28+
1. **Primary Board (Transmitter):** Runs the main UART code examples provided below.
29+
2. **Secondary Board (Receiver):** Reads from the UART interface and displays the output on a serial monitor like Arduino IDE or PuTTY.
30+
31+
### Circuit Setup
32+
- Connect the **TX1 (GPIO43)** of the primary board to the **RX** of the secondary board.
33+
- Connect the **RX1 (GPIO44)** of the primary board to the **TX** of the secondary board.
34+
- Connect the ground (GND) of both devices together.
35+
36+
![How to wire](assets/UARTTestingSetup.png)
37+
38+
### Code for Secondary Board
39+
The board simply forwards received UART data to its serial monitor. Use the following code:
40+
41+
```python
42+
from machine import UART
43+
44+
# Initialize UART
45+
uart = UART(1, baudrate=9600, tx=43, rx=44) # Adjust TX/RX pins as needed
46+
47+
while True:
48+
if uart.any(): # Check if data is available
49+
ch = uart.read(1).decode() # Read one character
50+
print(ch, end="") # Print to the console
51+
```
52+
53+
1. Flash the above code to the secondary board.
54+
2. Open a serial monitor for the secondary board (e.g., Arduino Lab for Micropython, Arduino IDE Serial Monitor, Putty).
55+
56+
57+
## Example 1: Testing UART
58+
59+
In this first example, we’ll create a program that prints `UART says Hi!` every second, allowing you to verify that the UART connection is working.
60+
61+
### Circuit Diagram
62+
For this example:
63+
- **Connect TX1 (GPIO43)** to the RX of your receiving device (e.g., USB-to-serial adapter).
64+
- **Connect RX1 (GPIO44)** to the TX of your receiving device.
65+
- **Connect GND** to the ground of the receiving device.
66+
67+
68+
### Code Example
69+
70+
Copy the following code into your `main.py` file and run it on the board you designated as "primary":
71+
72+
```python
73+
from machine import UART, Timer
74+
75+
# Initialize UART
76+
uart = UART(1, baudrate=9600, tx=43, rx=44)
77+
78+
# Timer to send debug message
79+
def send_debug_message(timer):
80+
uart.write("UART says Hi!\n")
81+
82+
# Configure the timer
83+
timer = Timer(0)
84+
timer.init(period=1000, mode=Timer.PERIODIC, callback=send_debug_message)
85+
86+
# Keep the program running
87+
while True:
88+
pass
89+
```
90+
91+
### Expected Output
92+
When connected to a serial monitor, you should see:
93+
94+
```
95+
UART says Hi!
96+
UART says Hi!
97+
UART says Hi!
98+
```
99+
![UART Example](assets/UARTHello.png)
100+
101+
If you don’t see this output, check your connections and ensure the baud rate matches.
102+
103+
## Example 2: Ping-Pong Communication
104+
105+
Next, let’s make the device respond with `pong` when it receives the message `ping`. This demonstrates how to handle incoming UART messages.
106+
107+
### Circuit Diagram
108+
Use the same circuit as before. Ensure TX, RX, and GND are properly connected.
109+
110+
### Code Example
111+
112+
Copy the following code into your `main.py` file and run it on the board you designated as "primary":
113+
114+
```python
115+
from machine import UART
116+
117+
# Initialize UART
118+
uart = UART(1, baudrate=9600, tx=43, rx=44)
119+
120+
buffer = ""
121+
122+
while True:
123+
if uart.any(): # Check if data is available
124+
ch = uart.read(1).decode() # Read one character
125+
uart.write(ch) # Echo the input
126+
buffer += ch
127+
128+
if ch == '\n': # End of message
129+
if buffer.strip().lower() == "ping":
130+
uart.write("pong\n")
131+
buffer = "" # Clear the buffer
132+
```
133+
Now copy the following code into your `main.py` file and run it on the board you designated as "secondary". In this case we are expanding the secondary board to be able to write via UART too:
134+
135+
```python
136+
from machine import UART
137+
import sys
138+
import
139+
140+
# Initialize UART
141+
uart = UART(1, baudrate=9600, tx=43, rx=44) # Adjust TX/RX pins as needed
142+
143+
while True:
144+
# Check if there's data coming from UART
145+
if uart.any():
146+
ch = uart.read(1).decode() # Read one character from UART
147+
print(ch, end="") # Print to USB serial monitor
148+
149+
# Check if there's data enselecttered in REPL
150+
if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
151+
input_text = sys.stdin.read().strip() # Read user input
152+
uart.write(input_text + "\n") # Send via UART
153+
```
154+
155+
### Expected Output
156+
1. Type `ping` followed by `Enter` in your serial monitor.
157+
2. You should see:
158+
```
159+
pong
160+
```
161+
162+
Any other input will simply be echoed back to the sender.
163+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /