Как передавать данные с портативного GPS, подключенного через USB-порт или последовательный COM-порт в Python? - PullRequest
0 голосов
/ 08 апреля 2019

Godd day y'all!

Я разрабатываю приложение для компьютеров под управлением Windows, которое должно непрерывно записывать местоположения GPS с внешнего устройства в фоновом режиме.При использовании систем Arduino / UNIX существует множество учебных пособий, однако я разрабатываю специально для Windows, поэтому многие из них не так легко переносимы ( также: я совершенно новичок в области ввода-вывода устройства в python ).

Установка внешнего программного обеспечения, такого как gpsd, на ПК пользователя не вариант .Я скачал драйверы libusb для Windows, которые будут поставляться с конечным продуктом (я полагаю, если вы не заметите, что это не обязательно).

Насколько я понимаю, pyserial должен иметь возможность взаимодействовать с обоимик USB-портам и аппаратным COM-портам, поскольку win7 + технически рассматривает USB-порты как виртуальные COM-порты - это правда?

Я успешно использовал pyusb для просмотра устройств, подключенных к моему компьютеру.Однако открытие устройства для ввода / вывода было запрещено (возможно, из-за того, что GPS не должен принимать входы?).

Я включил свой код для подключения и потоковой передачи данных (содержащий некоторый код, который я нашел в других SOсообщения, например Чтение информации USB-GPS с Python и другие, извините, я не могу вспомнить авторов оригинала, я забыл записать это в источнике. Если вы случайно наткнулись на свой собственный код, почувствуйтеВы можете запросить редактирование, и я обязуюсь.)

import usb
import usb.backend.libusb1

def streamDevice(dev: usb.core.Device = None):
    print(dev)
    if dev.is_kernel_driver_active(0) is True: dev.detach_kernel_driver(0)
    # use the first/default configuration
    dev.set_configuration(0)
    # first endpoint
    endpoint = dev [0][(0,0)][0]
    print(endpoint)
    # read a data packet
    data = None
    while True:
        try:
            data = dev.read(endpoint.bEndpointAddress,endpoint.wMaxPacketSize)
            print(data)

        except usb.core.USBError as e:
            data = None
            if e.args == ('Operation timed out',): continue

backend = usb.backend.libusb1.get_backend(find_library= lambda x: "DLL/MinGW64/dll/libusb-1.0.dll")
devices = usb.core.find(find_all = True, backend=backend)
mouse = None
for idx,dev in enumerate(devices):
    print(dev) #class 9 (hubs) cannot easily be printed using __str___
    if dev.bDeviceClass != 9: print(dev)
    else:
        print(" + Class: %s" % dev.bDeviceClass)
        print(" + Subclass: %i" % dev.bDeviceSubClass)
        print(" + Protocol: %i" % dev.bDeviceProtocol)
        print(" + Length  : %s" % dev.bLength)
        print(" + Configurations: %i" % dev.bNumConfigurations)
    if dev.bDeviceClass == '0xef':
        print('GPS found!')
        print(dev)
        streamDevice(dev)

В итоге:

1.Как я могу передать строку NMEA от устройства GPS, подключенного к физическому COM-порту в Python 3+, используя Windows7 +?

2.Как я могу надежно определить устройство и выполнить потоковую передачу с устройства GPS, подключенного к USB-порту USB в Python 3+, используя windows7 +?

Приветствия и большое спасибо заранее!

PS: не стесняйтесь указывать на любые мои заблуждения относительно последовательной связи в python и windows;как я уже сказал: я совершенно новичок в устройстве ввода-вывода в python и с удовольствием отредактирую свой вопрос!

...