Управление usb модемом python

Обновлено: 05.07.2024

Общение с USB-устройством должно быть простым через PyUSB. Итак, пытаюсь читать с USB-устройства (осциллографа) с помощью PyUSB под Win10. Судя по всему, USB-драйвер (libusb-win32 v1.2.6.0) установлен правильно, так как устройство найдено, и я получаю ответ от print(dev) (Смотри ниже). Из этого я вижу, что адрес конечной точки вывода 0x3 а адрес входной конечной точки 0x81

Если я отправлю *IDN? Я должен получить ответ ,P1337,1842237,V2.4.0-> . Но только если устройство уже находится в SCPI-режиме. По-видимому, это не так, и я получаю ошибку тайм-аута (см. Ниже).

Итак, что я здесь делаю не так? Какая информация мне не хватает в учебнике PyUSB. Я использую неправильные команды / параметры PyUSB, или дело в отсутствии дополнительных драйверов, или дело в аппаратном обеспечении, Win10 или аппаратном обеспечении устройства? Спасибо за подсказки, как узнать, что не так.

Кстати, какое второе значение в dev.read(0x81,7) ? Количество байтов для чтения? Обычно я не знаю, сколько байтов отправит устройство. Я ожидал, что команда будет читать до тех пор, пока не появится перевод строки или какой-либо другой символ терминатора в течение времени ожидания. Где я могу найти "защищенную от дурака" документацию, руководства и примеры по PyUSB?

Код:

Выход из print(dev) :

Обновить:

Я думаю, там было без шансов ответить на этот вопрос, если только кто-то уже не сталкивался с теми же проблемами. Мне жаль всех вас (@Alex P., @Turbo J, @igrinis, @ 2xB), которые не торопились, чтобы внести свои предложения о помощи.

Мои выводы: (Надеюсь они будут полезны другим):

Как это работает для меня (пока):

Ниже приведен минимальный код, который я ожидал от поставщика / производителя. Но вместо этого я потратил много времени на отладку их документации. Тем не менее, все еще происходят некоторые странные вещи, например кажется, вы получаете данные, только если заранее запрашиваете заголовок. Но, ну, это не тема исходного вопроса.

Код:

Результат: (используя gnuplot)


  • Молодцы, что решили эту проблему. Я знаю, что МНОГИЕ инструменты SCPI содержат действительно неприятные ошибки, подобные тем, которые вы описываете.

Как только вы получите ответ от устройства на *IDN? запрос, вы должны быть в порядке. Это SCPI;)

Посмотрите это видео, оно поможет вам взять себя в руки.

На ваш вопрос о read() параметры. Цитата из источника PyUSB:

Когда тайм-аут опущен, используется Device.default_timeout property как тайм-аут операции. Значения указаны в миллисекундах.

Если вы установите достаточно большой размер буфера, вы получите только фактически прочитанные байты. Итак, ваши ожидания оправдались.

  • спасибо за ваше предложение. Нет, при отправке ничего не произойдет :CHAN1:SCAL 10v или любое другое значение. Получил ответ от продавца. Я обновлю вопрос.
  • К сожалению, проблема заключалась в устаревшей документации, предоставленной поставщиком. Смотрите мой ответ. Кстати, я не понимаю, почему люди создают (или смотрят) 1-часовой видеоролик для чего-то, что должно уместиться на 2-х страницах бумаги.

Прежде всего обратите внимание, что @igrinis опубликовал видео, показывающее, чего вы хотите достичь.

(Как заявил @igrinis :) Для второго значения в read(. ) , теоретически вы правы. Хорошо то, что практически достаточно часто вы можете запросить более длинные ответы. Так что попробуйте, например, запрашивая 256 байт, и посмотрите, исправляет ли это ваш текущий код.

Если это не решит вашу проблему:

Документация для PyUSB:

В основном Python Docstring, поэтому звоните help(. ) на каждый объект / функцию, которую вы получаете от PyUSB. Как вариант, найдите в исходном коде PyUSB все функции и объекты, которые вы хотите прочитать в строке документации.

[Обновление] Добавлены подсказки к замечательному комментарию, в котором уже есть некоторые ответы и многое другое.

Это не полная команда SCPI: отсутствует новая строка \n символ в конце.

  • Спасибо за подсказку. Ах . Так глупо, в документации есть пример с msg='test' , из-за чего у меня сложилось впечатление, что модуль PyUSB заботится о символе конца строки. Я могу протестировать только на следующей неделе и проголосую за и приму, если это сработает.
  • Простите, нет. Просто добавив \n ничего не меняет с ошибкой тайм-аута. Документация производителя устройства о связи также довольно скудная.
  • Судя по всему, PyUSB заботится о конечных символах.

Задача была выполнена с помощью только этого модема и языка Python.

Первоначально было решено использовать модем одновременно как устройство подключения к интернету, так и AT-модем для отправки смс. Однако, как и следовало ожидать, он не мог работать сразу в двух режимах: при подключении к сети отправка смс становилась невозможной.

Попытка подсоединения двух 3G-модемов (один для интернета, другой для смс) терпела неудачу: устройства прекрасно функционировали отдельно друг от друга, но при одновременном подключении система видела только одно.

Положительный эффект дала замена одного модема на мобильник, но это меня не устраивало: желания тратить лишние деньги на телефон, пусть и недорогой, у меня не было.

В итоге у меня родилась идея использовать один 3G-модем, переключая его в нужные режимы программно: сначала подключаться через него к интернету, выгружать данные, затем отключаться, обрабатывать данные, и слать AT-команды для отправки смс. И всё это на языке Python.

Во-первых, отпадает необходимость во втором девайсе, а во-вторых, подключение к сети будет редким и кратковременным, что поможет сэкономить недешевый 3G-трафик.

Для отправки смс я использовал замечательный скрипт из хабра-топика Простой скрипт для рассылки СМС. А вот с управлением подключения к интернету пришлось повозиться. Можно, конечно, поставить Python-расширение для win32 и управлять им из win-API функций. Но оказалось, что гораздо проще производить манипуляции с сетевыми подключениями с помощью обычной утилиты RASDIAL.

Теперь запрограммируем небольшой модуль rasdial.py, который позволит нам управлять этим подключением:

  1. import os
  2. def connect(connection):
  3. command = r 'RASDIAL %s' % connection
  4. return os .system(command)
  5. def disconnect(connection):
  6. command = r 'RASDIAL %s /DISCONNECT' % connection
  7. return os .system(command)

Две функции модуля производят подключение/отключение интернета по единственному аргументу: имени подключения. Например, если вы назвали его «e160g», то вызов

  1. import rasdial
  2. code = rasdial.connect( 'e160g' )

попытается выполнить подключение и вернет статус возврата. Если 0, то соединение выполнено успешно.

Из-за потребностей проекта данные пикселей изображения на стороне FPGA должны быть переданы на сторону ПК через протокол USB2.0, поэтому для отправки и получения данных необходима библиотека python pyusb. Ниже описаны методы и проблемы, возникающие при использовании библиотеки pyusb.

1. Введение интерфейса USB

В этом процессе разработки я использовал чип-драйвер Cypress EZ-USB серии CY7C68013A для передачи данных USB на плате разработки FPGA. CY7C68013A - это высокоскоростной протокол связи USB2.0 и совместимый чип управления 8051 В этом чипе содержится 16 КБ встроенной оперативной памяти, вы можете напрямую запустить программу прошивки без дополнительной памяти. Рабочая частота внутреннего 8051 процессора CY7C68013A может составлять 48 МГц, 24 МГц, 12 МГц. На моей плате разработки FPGA 24 МГц используется как вход тактовой частоты. CY7C68013A объединяет 4 FIFO с общим размером 4 Кбайт. Пользователь может настроить его для работы в режиме Master или Slave путем установки. CY7C68013A содержит интерфейс I2C для подключения к внешней EEPROM.Первый пользователь загружает записанный файл микропрограммы .iic в EEPROM. При включении CY7C68013A он автоматически считывает программу EEPROM во внутреннюю память для запуска.
Микросхема CY7C68013A, используемая в этом проекте, настраивает программу встроенного программного обеспечения для работы в ведомом режиме асинхронного чтения-записи FIFO, в котором FIFO EP2 и EP4 задается в качестве порта вывода данных, а FIFO EP6 и EP8. Для порта ввода данных каждый порт содержит два 512-байтовых FIFO.Если 512-байтовый порт считывается пустым или полным, оборудование автоматически переключится на другой 512-байтовый FIFO. На этом внедрение USB-оборудования заканчивается, и если вам нужно изменить режим работы CY7C68013A, конфигурацию портов и сигналов, вы можете узнать больше о программе прошивки CY7C68013A и изменить ее.

2. Установка драйвера USB

Вотссылка на сайтЗагрузите библиотеку libusb.

Дважды щелкните по установке, выберите соответствующий интерфейс USB, установите и создайте папку LibUSB-Win32 (следующий путь не будет отображен)

В каталоге bin в папке LibUSB-Win32 щелкните inf-wizard, чтобы установить драйвер, сгенерировать информацию о драйвере USB и сохранить ее в любом каталоге.


Выберите интерфейс USB для установки в диспетчере устройств, выберите для обновления драйвера, перейдите в каталог только что сгенерированной информации о драйвере USB, начните обновлять драйвер и завершите установку драйвера.


Запишите идентификатор поставщика и идентификатор продукта в информации о драйвере

В-третьих, установка библиотеки pyusb

Здесь нечего уточнять, cmd запускается напрямую

В-четвертых, развитие pyusb

Создайте новый проект Python, импортируйте необходимую библиотеку USB, код выглядит следующим образом


Где idVendor = 0x04B4, idProduct = 0x1004, заменяется идентификатором Vender и идентификатором продукта USB-драйвера, который вы только что установили
При запуске программы будет распечатана соответствующая информация об интерфейсе USB.

Затем читайте и пишите USB, код выглядит следующим образом

Параметры функций чтения и записи в вышеупомянутом модуле чтения-записи соответственно отмечаются впоследствии,Пожалуйста, измените это самостоятельно
Запустите модуль чтения и записи отдельно, чтобы проверить USB-чтение и запись. Обратите внимание, что из-за характеристик USB-чипа на плате разработки FPGA, которую я использую, емкость четырех FIFO-дисков составляет 512 байт, поэтому длина одного чтения установлена ​​в модуле чтения моего главного компьютера. Это 512 байт. Если он меньше 512 байт, это приведет к проблеме невозможности чтения данных. Он также соответствует модулю записи (записи). Также необходимо записать полные 512 байт, прежде чем сторона ПЛИС получит прошлые данные, отправленные ПК. ,
На этом этапе разработка USB с использованием библиотеки pyusb python даже завершена, поскольку в этом проекте используется базовая функция приемопередатчика USB, программа относительно проста. Для более глубокого развития, пожалуйста, сделайте дальнейшее развитие самостоятельно.

Общая информация по работе с Python в модемах RX Печать

Изменено: Вт, 7 Апр, 2020 at 2:47 PM

ВНИМАНИЕ.

Работа со скриптами в модемах TELEOFIS не является базовым функционалом. Модемы серии RX разрабатывались именно с целью передачи данных по CSD каналу.

Наша компания НЕ разрабатывает скрипты для работы в составе модемов RX на заказ.

Модемы серии RX, разработанные на базе беспроводных модулей компании Telit, имеют встроенный интерпретатор языка программирования Python. Это дает возможность использовать модем RX в ряде задач, где модем выполняет отличные функции от базового.

На протяжении длительного времени, наша компания разработала ряд скриптов для нестандартного использования, в том числе и для наших служб.

Важно! На текущий момент, наша компания осуществляет поддержку обновления только одного скрипта - GPRSTerminal. Обновление остальных скриптов больше не производится, Вы можете использовать данные скрипты "как есть".

Список скриптов представлен ниже:

1. GprsTerminal (Поддержка обновлений)

2. NetQualitySimSwitcherRx (Архивный)

3. SmartSMS (Архивный)

4. TcpSimSwitcherProf (Архивный)

5. TcpSimSwitcherRx (Архивный)

6. WDT_10m (Архивный)

7. Zatvor (Архивный)

Для самостоятельного создания и использования скриптов необходимо обладать должными знаниями в области программирования и понимать специфику работы скриптов в GSM модемах.

Большая часть функционала работы приведенных скриптов реализована в терминалах серии WRX по умолчанию, без необходимости установки сторонних скриптов.Терминалы серии WRX специально предназначенные для передачи данных по GPRS. И в отличие от модема с установленным скриптом, такой терминал будет обладать рядом преимуществ:
- Настройка с помощью удобного ПО и через USB.
- Работа в режимах TCP-клиент и TCP-сервер.
- Соединение с терминалом по CSD в качестве резервного канала связи.
- Возможность просмотра отладочной информации в консольном окне.
- Реализована возможность удаленного обновления программного обеспечения.
- Приём исполняемых команд и настроек по SMS, GPRS, CSD.
- Передача информации о текущем состоянии и ошибках по служебному каналу и локально по USB.
- Инициализация прозрачного канала по расписанию.
- Инициализация прозрачного канала по команде.

У меня есть модем DWM-156 GSM. Ниже вы можете увидеть список устройств, добавленных на мой компьютер после подключения этого GSM-модема к USB-порту:

enter image description here

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

Я заменяю PORT_NUMBER на 9, 10 и 12. Это результаты:

Мои вопросы:

Вы никогда не вызываете serialPort.read() чтобы прочитать любой ответ.

  1. Почему в третьей программе он не смог открыть порт "COM13", пока я пытаюсь подключиться к COM12?

Класс Serial происходит из lib\site-packages\serial\serialwin32.py и является оболочкой класса Win32Serial .

Win32Serial наследует от SerialBase в lib\site-packages\serial\serialutil.py и инициализирует себя вызовом инициализатора SerialBase .

SerialBase устанавливает значение порта, назначая значение port , которое вы дали свойству port , которое вызывает SerialBase.setPort(port) .

setPort(port) проверяет, является ли переданное значение строкой или числом. Это число, поэтому он вызывает makeDeviceName(port) в классе Win32Serial .

makeDeviceName(port) вызывает device(port) .

device(port) - это функция, которая добавляет 1 к числу и помещает COM перед ним:

Зачем? Я не знаю. Но если вы передадите строку вместо этого, она не изменит ее. Попробуйте дать ему строку вместо: serial.Serial(port="COM12". вместо serial.Serial(port=12 но я подозреваю, что это serial.Serial(port=12 отвлечение, и это связано с тем, что описано в скриншоте диспетчера устройств как порт "debug", и, возможно, его нельзя открыть нормально.

Я этого не понимаю. Что значит "позвонить на SIM-карту"? Какие сырые данные? Вы не сможете записывать звуковые данные phonecall с помощью последовательной ссылки. и вы, вероятно, не сможете записывать данные модема, отправленные чем-то другим, потому что у Python будет открыт последовательный порт, а другая программа не сможет открыть его.

Читайте также: