Prior to this commit, when flushing a UART on the rp2 port, it returns just before the last character is sent out the wire. Fix this by waiting until the BUSY flag is cleared. This also fixes the behaviour of `UART.txdone()` to return `True` only when the last byte has gone out. Updated docs and tests to match. The test now checks that UART TX time is very close to the expected time (prior, it was just testing that the TX time was less than the expected time). Signed-off-by: Damien George <damien@micropython.org>
37 lines
996 B
Python
37 lines
996 B
Python
# Test machine.UART transmission.
|
|
# Does not require any external connections.
|
|
|
|
try:
|
|
from machine import UART
|
|
except ImportError:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
import time, sys
|
|
|
|
# Configure pins based on the target.
|
|
if "rp2" in sys.platform:
|
|
uart_id = 0
|
|
tx_pin = "GPIO0"
|
|
rx_pin = "GPIO1"
|
|
timing_margin_us = 180
|
|
else:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
# Test that write+flush takes the expected amount of time to execute.
|
|
for bits_per_s in (2400, 9600, 115200):
|
|
text = "Hello World"
|
|
uart = UART(uart_id, bits_per_s, bits=8, parity=None, stop=1, tx=tx_pin, rx=rx_pin)
|
|
|
|
start_us = time.ticks_us()
|
|
uart.write(text)
|
|
uart.flush()
|
|
duration_us = time.ticks_diff(time.ticks_us(), start_us)
|
|
|
|
# 1(startbit) + 8(bits) + 1(stopbit) + 0(parity)
|
|
bits_per_char = 10
|
|
expect_us = (len(text)) * bits_per_char * 1_000_000 // bits_per_s
|
|
delta_us = abs(duration_us - expect_us)
|
|
print(bits_per_s, delta_us <= timing_margin_us or delta_us)
|