2016-04-20 2 views
0

Я пытаюсь передать Arduino с помощью python. Я смог подключить его, используя модуль serial. Это код:Общайтесь Arduino с python

import serial 

while True: 
    print "Opening port" 
    arduinoData = serial.Serial("com7", 9600) 
    print "The port is open" 

    while (arduinoData.inWaiting()==0): #I wait for data 
    print "There is no data" 

    print "Reading data" 
    arduinoString = arduinoData.readline() 
    print arduinoString 

Кажется, что висит, когда я хочу, чтобы прочитать данные, в строке, которая говорит arduinoString = arduino.readline().

В чем может быть проблема?

ответ

1

вместо использования цикла while внутри основного цикла while вы можете использовать оператор if else. Кроме того, чтобы прочитать данные, вы можете использовать функцию чтения с arduinoData.inWaiting() в качестве параметра, например: arduinoData.read(arduinoData.inWaiting()). Я надеюсь, что этот код поможет вам:

arduinoData = serial.Serial("com7", 9600) 

while True: 

    if arduinoData.inWaiting() > 0: # check if there is data available 
     print "Reading data" 
     arduinoString = arduinoData.read(arduinoData.inWaiting()) '''read and decode data''' 
     print arduinoString 

    else: 
     print "There is no data" 
+0

Благодарим вас за ответ. Я получаю эту ошибку: 'AttributeError: 'Serial' объект не имеет атрибута 'ser''. Но когда я удаляю 'ser', он не открывает порт. Я делаю что-то неправильно? –

+0

Извините, если этот вопрос кажется глупым, но сначала вы импортировали серийный модуль? – mekoda

+0

Да, я сначала импортировал серию. Я просто не размещал его в этой части кода. –

0

Хорошо, вы получаете ошибку AttributeError: 'Serial' object has no attribute 'ser', потому что в действительности ser не существует в arduinoData объекта. Это моя вина, потому что я думал о классе, который я создал в своей программе, содержащей ser, который является всего лишь очередным серийным объектом. Чтобы исправить это, просто замените arduinoData.ser на arduinoData

Чтобы добавить, вы должны, вероятно, объявить arduinoData вне цикла while. вы должны сделать это, потому что каждый раз, когда вы создаете серийный объект, требуется время, чтобы подключиться к Arduino. Для этого ваша программа, возможно, не сможет прочитать данные.

Надеюсь, этот ответ вам поможет.

1

Структура вашего кода странная. У меня была аналогичная проблема, создав объект Serial в функции, не делая его глобальным. Возможно, вы должны поместить эту линию за пределы цикла:

arduinoData = serial.Serial("com7", 9600)

Кроме того, ваша инициализация кажется немного легкой. Обычно я использую больше параметров, но это зависит от вашего оборудования.

ser = serial.Serial( 
    port = 'com4', \ 
    baudrate = 19200, \ 
    parity=serial.PARITY_NONE, \ 
    stopbits=serial.STOPBITS_ONE, \ 
    bytesize = serial.EIGHTBITS, \ 
    timeout = 0.25) 

Обходной для Readline() вопрос coud использовать функцию чтения() вместо проверки и, если он содержит данные.

Надеюсь, это поможет!

+0

Извините за поздний ответ. Да ты прав. Я должен установить больше пареметров для лучшего. Спасибо за ваш ответ и помощь. –

Смежные вопросы