Форум сайта python.su
0
Пытаюсь получить данные с Ардуино уно по COM порту(COM4).
Код Ардуино:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
for (int i=0;i<9;i++){
Serial.println((i));
delay(500);
}
Serial.println(“close”);
}
В COM-порт идут числа 1-9 и строка “close”
Код Питона:
import serial
import time
SERIAL_PORT = ‘COM4’
SERIAL_SPEED = 9600
sum = 0
ser = serial.Serial(SERIAL_PORT, SERIAL_SPEED, dsrdtr = 1,timeout = 0)
time.sleep(2)
i = 1
while i==1:
a=ser.readline()
time.sleep(0.5)
print(a)
sum+=a
if a==“close”:
ser.close()
ser.close()
Когда нет строки sum+=a в консоле выводится это:
…
b'7\r\n'
b'8\r\n'
b'9\r\n'
b'close\r\n'
Как мне, например, проводить арифметические операции с этими данными? Просто если строку sum+=a расскоментить, то в консоле:
sum+=a
TypeError: unsupported operand type(s) for +=: ‘int’ and ‘bytes’
Как я понимаю приходит байтовый формат и… не знаю. Как вообще правильно считать данные с COM-порта?
Отредактировано kamikADzzzeeeee (Ноя. 26, 2019 11:51:06)
Офлайн
857
kamikADzzzeeeeeВ i1 изначально находится мусор. Что ты там инкрементируешь? Сначала обнули её перед циклом.
В COM-порт идут числа 1-9 и строка “close”
for (i = 0; i < 9; i++)
kamikADzzzeeeeeСначала нужно их к числам привести
Как мне, например, проводить арифметические операции с этими данными?
>>> b'123\r\n' b'123\r\n' >>> int(b'123\r\n') 123 >>> n = int(b'123\r\n') >>> n 123 >>>
Офлайн
0
py.user.next
kamikADzzzeeeee
В COM-порт идут числа 1-9 и строка “close”
В i1 изначально находится мусор. Что ты там инкрементируешь? Сначала обнули её перед циклом.
Цикл for для повторения девяти раз нужно писать стандартной идиомой
for (i = 0; i < 9; i++)
py.user.next
kamikADzzzeeeee
Как мне, например, проводить арифметические операции с этими данными?
Сначала нужно их к числам привести
>>> b'123\r\n'
b'123\r\n'
>>> int(b'123\r\n')
123
>>> n = int(b'123\r\n')
>>> n
123
>>>
Офлайн
857
Сначала проверяй на close, а потом приводи к числу, если там не close.
while True: ... if a.startswith(b'close'): break n = int(a) print(n * 2)
Офлайн
0
py.user.nextТ.е. получается с COM порта идет строковая переменная? Пипец. Спасибо большое
Сначала проверяй на close, а потом приводи к числу, если там не close.
import serial import time SERIAL_PORT = 'COM4' SERIAL_SPEED = 9600 sum = 0 ser = serial.Serial(SERIAL_PORT, SERIAL_SPEED, dsrdtr = 1,timeout = 0) time.sleep(2) i = 1 while i==1: a=ser.readline() time.sleep(0.5) c="" b=0 if a.startswith(b'close'): c="close" else: b=int(a) print(str(b)+' '+c+' '+str(b**2)
Отредактировано kamikADzzzeeeee (Ноя. 26, 2019 12:42:50)
Офлайн
857
kamikADzzzeeeeeПоследовательность байтов идёт. У байтовых объектов есть многие методы, аналогичные строковым методам. Также есть регулярные выражения для байтовых объектов. А сам байтовый объект - это последовательность чисел от 0 до 255.
Т.е. получается с COM порта идет строковая переменная?
kamikADzzzeeeee
Вот мой корявый код если что.import serial import time SERIAL_PORT = 'COM4' SERIAL_SPEED = 9600 sum = 0 ser = serial.Serial(SERIAL_PORT, SERIAL_SPEED, dsrdtr = 1,timeout = 0) time.sleep(2) i = 1 while i==1: a=ser.readline() time.sleep(0.5) c="" b=0 if a.startswith(b'close'): c="close" else: b=int(a) print(str(b)+' '+c+' '+str(b**2)
Отредактировано py.user.next (Ноя. 26, 2019 13:18:28)
Офлайн
0
py.user.next
Да, код дубовый, конечно, и с точки зрения алгоритмирования, и с точки зрения питона. Где выход из цикла?
Отредактировано kamikADzzzeeeee (Ноя. 26, 2019 13:43:34)
Офлайн