серийные данные портятся

Я использую эту небольшую программу на своем Raspberry Pi, чтобы получить строку, отправленную моим Arduino.

import time
import serial

ser = serial.Serial('/dev/ttyACM0', 9600)

def check_for_command():
    bytestoread = ser.inWaiting()
    if bytestoread != 0:
        temp = ser.read(bytestoread)
        print(temp)

while 1:
    check_for_command()
    time.sleep(0.1)

код на ардуино довольно прост:

void setup(){
Serial.begin(9600);
}

void loop(){
Serial.println(“Hello Pi”);
delay(2000);

самая раздражающая часть. Я получаю это:

b'Привет, Пи\r\n'

вместо чистого

Привет Пи

Как мне избавиться от этих лишних битов, не используя список для каждого символа.

Заранее спасибо!

, 👍1

Обсуждение

Код Python не обязательно должен быть настолько сложным. После того, как вы откроете устройство для дескриптора, все, что вам нужно, это -- linenin=ser.readline() --- и хорошо, что вы используете -- Serial.println -- на Arduino, который отправляет символ \n в конце строки, поэтому он будет работать нормально. Тогда все, что вам нужно в Python, это -- print linein -- чтобы увидеть, что вы получили. Ничего сложного не требуется. Просто относитесь к нему как к файлу и помните, что ser.readline() — это блокирующая функция. Он остановит все и будет ждать ввода., @SDsolar


3 ответа


Лучший ответ:

1

Префикс b в Python 3 просто означает, что это литерал bytes. Это не часть вывода, это просто говорит вам о типе.

\r\n — это обычные символы возврата каретки и новой строки в конце строки. Вы можете удалить это из своей строки, вызвав strip().

Поскольку это возвращаемые числа с плавающей запятой, я предполагаю, что вы захотите использовать их каким-то образом после того, как они будут прочитаны:

import serial

ser = serial.Serial('/dev/ttyACM0', 9600)
while True:
   value = float(ser.readline().strip())
   print('New value is {0:0.2f}'.format(value))

См. также:

  • Что означает 'b ' перед строковым литералом?
,

пытаясь использовать ваши строки, я получаю ошибку формата в последней строке. непосредственно перед .format, @Anton van der Wel

Можете ли вы скопировать и вставить точную ошибку?, @Ameer

исправил эту ошибку, нашел новую, которая иногда возникает, первая проблема была: я использую python 3, поэтому для print нужны скобки. :) другая ошибка - это когда случайно последовательные цепочки объединяют два числа: ValueError: не удалось преобразовать строку в число с плавающей запятой: b'21.020.5', @Anton van der Wel

Я обновил свой код, чтобы включить отпечатки в стиле python 3., @Ameer

и теперь вы предлагаете попробовать и поймать, чтобы избежать ValueError?, @Anton van der Wel

ValueError возникает только тогда, когда последовательные цепочки связывают два числа, верно? В этом случае вы можете либо использовать попытку и поймать, либо увеличить задержку в цикле Arduino., @Ameer

если я хочу отправить строку вместо числа с плавающей запятой и хочу избавиться от префикса b? преобразование float в строку не работает., @Anton van der Wel

Каково точное сообщение об ошибке?, @Ameer


0

Использовать эту строку

temp = ser.readline(bytestoread).decode('ascii')

вместо

temp = ser.read(bytestoread)
,

-1

Поскольку байты, отправленные Raspbian, закодированы в UTF-8, используйте следующую строку, чтобы избежать strip() на более позднем этапе:

temp = ser.read(bytestoread).decode('utf-8')
,

Ну, это не Raspi отправляет, а Arduino. А decode() *не* удаляет '\r\n' из декодированной строки., @the busybee