Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 26, 2019 11:07:59

kamikADzzzeeeee
Зарегистрирован: 2019-11-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Python serial Arduino

Пытаюсь получить данные с Ардуино уно по 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)

Офлайн

#2 Ноя. 26, 2019 11:36:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Python serial Arduino

kamikADzzzeeeee
В COM-порт идут числа 1-9 и строка “close”
В i1 изначально находится мусор. Что ты там инкрементируешь? Сначала обнули её перед циклом.

Цикл for для повторения девяти раз нужно писать стандартной идиомой
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
>>>



Офлайн

#3 Ноя. 26, 2019 11:59:29

kamikADzzzeeeee
Зарегистрирован: 2019-11-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Python serial Arduino

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
>>>


Имеете ввиду вот так:
while i==1:
a=ser.readline()
time.sleep(0.5)
print(a)
b = int(a)
if a==“close”:
ser.close()

ser.close()


Тогда в консоле ошибка:
b = int(a)
ValueError: invalid literal for int() with base 10: b'close\r\n'

Офлайн

#4 Ноя. 26, 2019 12:22:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Python serial Arduino

Сначала проверяй на close, а потом приводи к числу, если там не close.

  
while True:
    ...
    if a.startswith(b'close'):
        break
    n = int(a)
    print(n * 2)



Офлайн

#5 Ноя. 26, 2019 12:41:50

kamikADzzzeeeee
Зарегистрирован: 2019-11-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Python serial Arduino

py.user.next
Сначала проверяй на close, а потом приводи к числу, если там не close.
Т.е. получается с COM порта идет строковая переменная? Пипец. Спасибо большое

Вот мой корявый код если что.
 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)

Офлайн

#6 Ноя. 26, 2019 13:15:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Python serial Arduino

kamikADzzzeeeee
Т.е. получается с COM порта идет строковая переменная?
Последовательность байтов идёт. У байтовых объектов есть многие методы, аналогичные строковым методам. Также есть регулярные выражения для байтовых объектов. А сам байтовый объект - это последовательность чисел от 0 до 255.

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)

Офлайн

#7 Ноя. 26, 2019 13:43:10

kamikADzzzeeeee
Зарегистрирован: 2019-11-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Python serial Arduino

py.user.next
Да, код дубовый, конечно, и с точки зрения алгоритмирования, и с точки зрения питона. Где выход из цикла?

Тааак? Извините, учу только третий день
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”
break
else:
b=int(a)
print(str(b)+' ‘+c+’ '+str(b**2)

Отредактировано kamikADzzzeeeee (Ноя. 26, 2019 13:43:34)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version