серийные данные портятся
Я использую эту небольшую программу на своем 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'
вместо чистого
Привет Пи
Как мне избавиться от этих лишних битов, не используя список для каждого символа.
Заранее спасибо!
3 ответа
Лучший ответ:
Префикс 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
Использовать эту строку
temp = ser.readline(bytestoread).decode('ascii')
вместо
temp = ser.read(bytestoread)
Поскольку байты, отправленные Raspbian, закодированы в UTF-8, используйте следующую строку, чтобы избежать strip() на более позднем этапе:
temp = ser.read(bytestoread).decode('utf-8')
Ну, это не Raspi отправляет, а Arduino. А decode()
*не* удаляет '\r\n' из декодированной строки., @the busybee
- Последовательная связь Arduino с Python: отправка массива
- Сброс последовательного порта Arduino в последовательном мониторе и Python
- Последовательная связь между python и arduino
- Отправка информации (например, строки) через цифровые контакты
- Почему нужно использовать latin-1 вместо utf-8 при использовании python с arduino?
- Метод перебора битов в байте, отправленном по последовательному каналу.
- Как управлять неопикселями, прикрепленными к Digispark?
- Ошибка при загрузке скетча в Arduino UNO с помощью CLI
Код Python не обязательно должен быть настолько сложным. После того, как вы откроете устройство для дескриптора, все, что вам нужно, это -- linenin=ser.readline() --- и хорошо, что вы используете -- Serial.println -- на Arduino, который отправляет символ \n в конце строки, поэтому он будет работать нормально. Тогда все, что вам нужно в Python, это -- print linein -- чтобы увидеть, что вы получили. Ничего сложного не требуется. Просто относитесь к нему как к файлу и помните, что ser.readline() — это блокирующая функция. Он остановит все и будет ждать ввода., @SDsolar