Ошибка 'NoneType' object has no attribute 'to_dict'
Пытаюсь считать данные, используя pymavlink. При компиляции появляется ошибка AttributeError: 'NoneType' object has no attribute 'to_dict'. Я не могу понять, почему в данном случае master.recv_msg() возвращает None.
import time
from pymavlink import mavutil
master = mavutil.mavlink_connection('tcp:000.000.000.0:0000')
def read_values():
try:
msg = master.recv_msg().to_dict()
#print(msg)
while True:
Battery_current = (msg['current_battery']*2)/100
Battery_voltage=((msg['voltages'])[0])/1000
Battery_SOC=((msg['voltages'])[9])/10
print("Battery current = "+str(Battery_current)+" Battery voltage = "+str(Battery_voltage)+" SOC = "+str(Battery_SOC))
except KeyboardInterrupt:
print("Program stopped")
read_values()
Если я делаю все то же самое, но без функции, а только с помощью while, то все работает:
import time
from pymavlink import mavutil
master = mavutil.mavlink_connection('tcp:000.000.000.0:0000')
while True:
try:
msg = master.recv_msg().to_dict()
#print(msg)
if msg['mavpackettype'] == 'BATTERY_STATUS':
Battery_current = (msg['current_battery']*2)/100
Battery_voltage=((msg['voltages'])[0])/1000
Battery_SOC=((msg['voltages'])[9])/10
#print("Battery current = "+str(Battery_current)+" Battery voltage = "+str(Battery_voltage)+" SOC = "+str(Battery_SOC))
except:
pass
time.sleep(0.5)
Ответы (2 шт):
Может В функции он принимает master за локальную переменеую?
Поставь в функции global master или передай его в качестве аргумента
Если вы привели правильный код, то возможно во втором случае у вас тоже периодически выпадает тот же эксепшен, но вы его просто не видите из-за того, что просто пропускаете все ошибки:
except:
pass
В первом же куске кода вы ловите только прерывание с клавиатуры, поэтому видите остальные исключения:
except KeyboardInterrupt:
print("Program stopped")
Документации толком нагуглить не удалось, но судя по фрагментам кода, которые я видел, цикл работы должен быть такой:
while True:
try:
msg = master.recv_msg()
if msg: # проверка, что сообщение не пустое
print(msg)
# дальнейшая работа с msg
except:
pass # не очень хорошо, лучше тут печатать ошибку хотя бы
time.sleep(0.5)