последовательная коммуникация microbit разбивает текст на строки - PullRequest
1 голос
/ 02 февраля 2020

Я новичок в микробите, и я попытался скопировать код из разных уроков / примеров кода. Я просто пытаюсь настроить последовательную связь между компьютером и микробитом. Мой план состоит в том, чтобы микробит просто отображал каждую полученную строку и отправлял ее обратно. Но линии разделены, и я не уверен, что это микробит или компьютер делает разделение. Я пробовал с двух разных компьютеров с одинаковым результатом.

Вот код микробита:

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 'в одном слове. Я мог бы написать код для объединения текста, но тогда я мог выйти из-под контроля c.

1 Ответ

1 голос
/ 03 февраля 2020

Я повторил ваши результаты, используя python 3.5 на Linux и микробите.

Я немного изменил код 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()

Попробуйте это как микро python на вашем микробите:

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, чтобы убедиться, что это решит проблему. Это не доступно в микро python на микробите в настоящее время.

...