Raspberry Pi pico will not accept complete data if uart.readline() is used to read serial data.
How to solve this problem?
Hey Lance,
How did you have everything hooked up and were you using the micropython implementation to program the Pico? PS: if you could send through your code that would be amazing!
I can imagine that function is looking for a delimiter sign such as the new line character so throwing that in once your line of data is ‘over’ that will give the function the data it just read.
Hey Lance,
To add to Liams response you can check out the documentation on the module here: class UART – duplex serial communication bus — MicroPython 1.16 documentation
There are also some examples in the Python SDK on the Raspberry Pi Org website here: https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-python-sdk.pdf
Let us know how you go!
Yes, I use micropython.
from machine import UART,Pin
import time
import _thread
#Defining the serial port
uart1 = UART(1, baudrate = 115200, tx = Pin(4), rx = Pin(5))
#Define five-wire, four-phase motor pins
motor1a = Pin(9,Pin.OUT)
motor1b = Pin(10,Pin.OUT)
motor1c = Pin(11,Pin.OUT)
motor1d = Pin(12,Pin.OUT)
def forward(delay, maxspeed): #Stepper motor forward function, define the stepper motor
for double four beat drive mode
for i in range(0, maxspeed):
motor1a.high()
motor1b.high()
motor1c.low()
motor1d.low()
time.sleep(delay)
motor1a.low()
motor1b.high()
motor1c.high()
motor1d.low()
time.sleep(delay)
motor1a.low()
motor1b.low()
motor1c.high()
motor1d.high()
time.sleep(delay)
motor1a.high()
motor1b.low()
motor1c.low()
motor1d.high()
time.sleep(delay)
def backward(delay, maxspeed): #Stepper motor reversing function
for i in range(0, maxspeed):
motor1a.low()
motor1b.low()
motor1c.high()
motor1d.high()
time.sleep(delay)
motor1a.low()
motor1b.high()
motor1c.high()
motor1d.low()
time.sleep(delay)
motor1a.high()
motor1b.high()
motor1c.low()
motor1d.low()
time.sleep(delay)
motor1a.high()
motor1b.low()
motor1c.low()
motor1d.high()
time.sleep(delay)
def stop(): #Motor stop function
motor1a.low()
motor1b.low()
motor1c.low()
motor1d.low()
def dianji():
forward(0.005, 512)
stop()
time.sleep(3)
backward(0.005, 512)
stop()
time.sleep(3)
def zrun():
forward(0.005, 512)
def frun():
backward(0.005, 512)
def runing(list2):
while switch == '\x01':
motor1a.low()
motor1b.low()
motor1c.high()
motor1d.high()
time.sleep(0.005)
motor1a.low()
motor1b.high()
motor1c.high()
motor1d.low()
time.sleep(0.005)
motor1a.high()
motor1b.high()
motor1c.low()
motor1d.low()
time.sleep(0.005)
motor1a.high()
motor1b.low()
motor1c.low()
motor1d.high()
time.sleep(0.005)
switch = list2[13]
#counti = 0
#list2 = []
motor_off = ['S', 'T', '<', '\x10', '\x10', '\x00', '\x07', 's', 'w', 'i', 't', 'c', 'h',
'\x00', '>', 'E', 'T']#Serial screen command, can be modified by yourself
motor_on = ['S', 'T', '<', '\x10', '\x10', '\x00', '\x07', 's', 'w', 'i', 't', 'c', 'h',
'\x01', '>', 'E', 'T']
time.sleep(1)
def threadone():
counti = 0
list2 = []
try:
rxdata = uart1.read(40)
list1 = list(rxdata)
print(list1)
except BaseException as e:
#print('No data received on serial port')
time.sleep(0.005)
else:
#list1 = list(jieshou)
#list2 = []
for item in list1:
list2.append(chr(item))
counti += 1
if item == 62: #The serial port returns the ASCII decimal
value of the character with the end flag '>' in the command data
for item2 in range(2): #When reading '>' and then read two characters
back, so that the full instruction is displayed, but there are actually two check digits of
characters after it
counts = list1[counti]
list2.append(chr(counts))
counti += 1
#break
print(list2)
return list1[13]
break
uart1.sendbreak()
while True:
#time.sleep(1)
sss = threadone()
if sss == 1:
while True:
if threadone() == 0:
motor1a.low()
motor1b.low()
motor1c.low()
motor1d.low()
break
else:
motor1a.low()
motor1b.low()
motor1c.high()
motor1d.high()
time.sleep(0.005)
motor1a.low()
motor1b.high()
motor1c.high()
motor1d.low()
time.sleep(0.005)
motor1a.high()
motor1b.high()
motor1c.low()
motor1d.low()
time.sleep(0.005)
motor1a.high()
motor1b.low()
motor1c.low()
motor1d.high()
time.sleep(0.005)
Thanks for the reply, I’ll keep looking for a solution!
Hey @Lance167598, are you using the hardware uart (eg. GPIO 0 and 1) or are you trying to scan for user input through the USB uart?
If it’s the latter, I think you’ll need to use stdin.readline()
instead
Hey @Lance167598
Reading through the script, it appears that on line 6, uart1 has been defined to use pins 4 and 5, although as Michael said, were you trying to scan for user input via the USB or the pins 0 and 1 for hardware UART?
If I understand the docs that the UART library for MicroPython 1.16 has on those methods, it appears that stating pins 4 and 5 as TX and RX references these two pins as seen on the image I’ve added below the link. It may be worth double-checking the pinout in the project is correct to ensure that they’re the right pins, and maybe try using the standard pins for hardware UART and adjusting the MicroPython appropriately to ensure that nothing else is going on with the Pico unexpectedly. Please let us know how you go with it! The Pico is still quite a young board, so having info available for the community on it for common issues is always helpful and appreciated
https://docs.micropython.org/en/latest/library/machine.UART.html#methods
I use the hardware uart, I checked the uart.readline() function, the underlying logic of the uart.readline() function is to determine the carriage return character, but the serial screen I am using has the command ending ET.
So the uart.readline() function doesn’t recognize the end of my instruction so that it can’t read the whole thing.