microbit 串行通信将文本拆分为行
microbit serial communication splits text into lines
我是 microbit 的初学者,我尝试从不同的 tutorials/code 示例中复制一些代码。我只是想在计算机和 microbit 之间建立串行通信。我的计划是让 microbit 只回显它收到的每一行,然后暂时将其发回。但是线条是分开的,我不确定是微比特还是电脑在做分裂。我在两台不同的电脑上试过,结果相同。
这里是微比特代码:
from microbit import *
uart.init(baudrate=115200)
msg_str = ""
while True:
msg_bytes = uart.readline()
if (msg_bytes):
print(msg_bytes)
我的电脑代码,一个 Python 带有 pyserial 的程序:
import serial
import serial.tools.list_ports as list_ports
def find_microbit_comport():
ports = list(list_ports.comports())
for p in ports:
if (p.pid == 516) and (p.vid == 3368):
return str(p.device)
if __name__ == '__main__':
ser = serial.Serial()
ser.baudrate = 115200
ser.timeout = 1
ser.port = find_microbit_comport()
ser.open()
ser.write(b'testing')
text = ser.readline()
while text != b'':
print(text.decode('utf-8'))
text = ser.readline()
ser.close()
我遇到的问题是它打印出这个:
b'te'
b'sting'
我原以为它会用一个词打印 b'testing'。我可以编写代码来组合文本,但我可能会失去同步。
我在 Linux 上使用 python 3.5 和微比特复制了您的结果。
我稍微修改了 Python 代码。请在下面找到:
import serial
import serial.tools.list_ports as list_ports
def find_microbit_comport():
ports = list(list_ports.comports())
for p in ports:
if (p.pid == 516) and (p.vid == 3368):
return str(p.device)
if __name__ == '__main__':
print('running code')
ser = serial.Serial()
ser.baudrate = 115200
ser.timeout = 1
ser.port = find_microbit_comport()
ser.open()
ser.write('hello there\n')
ser.close()
ser.open()
text = ser.readline()
while (1):
print(text.decode('utf-8'))
text = ser.readline()
ser.close()
在你的 microbit 上试试这个作为 micropython:
from microbit import *
uart.init(baudrate=115200)
msg_str = 'out: '.strip()
while True:
new_byte = (uart.read(1))
if new_byte == None:
continue
new_char = str(new_byte, 'UTF-8')
msg_str += new_char
if ("\n" in msg_str):
print(msg_str)
msg_str = ''
输出:
running code
out:hello there
这会一次读取一个字节,直到找到换行符,然后将每个字节附加到输出字符串上。危险是换行符在通过串口传输的过程中被丢弃。它在有线连接上非常可靠。如果使用无线传输,字符很容易损坏或丢失。
我想调整 uart.init 超时参数,看看是否可以解决问题。目前在 microbit 上的 micropython 中不可用。
我是 microbit 的初学者,我尝试从不同的 tutorials/code 示例中复制一些代码。我只是想在计算机和 microbit 之间建立串行通信。我的计划是让 microbit 只回显它收到的每一行,然后暂时将其发回。但是线条是分开的,我不确定是微比特还是电脑在做分裂。我在两台不同的电脑上试过,结果相同。
这里是微比特代码:
from microbit import *
uart.init(baudrate=115200)
msg_str = ""
while True:
msg_bytes = uart.readline()
if (msg_bytes):
print(msg_bytes)
我的电脑代码,一个 Python 带有 pyserial 的程序:
import serial
import serial.tools.list_ports as list_ports
def find_microbit_comport():
ports = list(list_ports.comports())
for p in ports:
if (p.pid == 516) and (p.vid == 3368):
return str(p.device)
if __name__ == '__main__':
ser = serial.Serial()
ser.baudrate = 115200
ser.timeout = 1
ser.port = find_microbit_comport()
ser.open()
ser.write(b'testing')
text = ser.readline()
while text != b'':
print(text.decode('utf-8'))
text = ser.readline()
ser.close()
我遇到的问题是它打印出这个:
b'te'
b'sting'
我原以为它会用一个词打印 b'testing'。我可以编写代码来组合文本,但我可能会失去同步。
我在 Linux 上使用 python 3.5 和微比特复制了您的结果。
我稍微修改了 Python 代码。请在下面找到:
import serial
import serial.tools.list_ports as list_ports
def find_microbit_comport():
ports = list(list_ports.comports())
for p in ports:
if (p.pid == 516) and (p.vid == 3368):
return str(p.device)
if __name__ == '__main__':
print('running code')
ser = serial.Serial()
ser.baudrate = 115200
ser.timeout = 1
ser.port = find_microbit_comport()
ser.open()
ser.write('hello there\n')
ser.close()
ser.open()
text = ser.readline()
while (1):
print(text.decode('utf-8'))
text = ser.readline()
ser.close()
在你的 microbit 上试试这个作为 micropython:
from microbit import *
uart.init(baudrate=115200)
msg_str = 'out: '.strip()
while True:
new_byte = (uart.read(1))
if new_byte == None:
continue
new_char = str(new_byte, 'UTF-8')
msg_str += new_char
if ("\n" in msg_str):
print(msg_str)
msg_str = ''
输出:
running code
out:hello there
这会一次读取一个字节,直到找到换行符,然后将每个字节附加到输出字符串上。危险是换行符在通过串口传输的过程中被丢弃。它在有线连接上非常可靠。如果使用无线传输,字符很容易损坏或丢失。
我想调整 uart.init 超时参数,看看是否可以解决问题。目前在 microbit 上的 micropython 中不可用。