Серийные порты Linux и Windows

user2840470 спросил: 28 марта 2018 в 02:29 в: linux

У меня возникают проблемы с моей pyserial программой на Ubuntu 16. Я пытаюсь отправить команду break на аппаратное устройство с использованием pyserial. Я написал сценарий python, который:

  1. Устанавливает порт / baud / parity / bytesize /...
  2. Открывает порт
  3. Отправляет перерыв command
  4. Считывает возвращаемое сообщение с устройства.

Я запускаю сценарий на своей машине Ubuntu 16.04 и получаю нулевой ответ, он просто зависает или заканчивается таймаутом. Я копирую один и тот же скрипт на свой компьютер с Windows, меняю порт (от / dev / ttyUSB0 до COM #), и мой скрипт работает отлично, немедленно получает ответ от устройства.

Когда я запускаю скрипт на Ubunutu Я должен предоставить разрешения для порта (sudo chmod 666 / dev / ttyUSB), или я получаю разрешение отклонять ошибки при открытии порта. Не уверен, что это имеет значение.

Есть ли у кого-нибудь представление о том, что может произойти? Я знаю, что Windows и Linux обрабатывают порты serial / com по-разному, но я новичок в Linux и сериале, поэтому не уверен, что что-то не хватает.

Я использую этот USB для последовательного кабеля (http:// www.ugreen.com.cn/product-681-en.html), и мне пришлось установить некоторые драйверы. Я подключил последовательные контакты чтения / записи и протестировал их, чтобы убедиться, что данные проходят (что есть), поэтому я знаю, что это работает.

import serial
ser = serial.Serial()
ser.port = '/dev/ttyUSB0' # or COM12 on windows
ser.baudrate = 9600
ser.parity = serial.PARITY_NONE
ser.bytesize = serial.EIGHTBITS
ser.stopbits = serial.STOPBITS_ONE
ser.open()
ser.send_break(duration=0.9)
print(ser.read(10))

1 ответ

Michael O. ответил: 28 марта 2018 в 03:47

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

sudo usermod -aG dialout <user>

Вам необходимо перезагрузить систему, чтобы завершить ее.

Чтобы некоторая информация не оставалась в буферах, вам может потребоваться очистить буферы чтения и записи перед операциями последовательного порта:

pyserial 3.0:

ser.reset_input_buffer()
ser.reset_output_buffer()

pyserial 2.7 или более ранняя версия:

ser.flushInput()
ser.flushOutput()

Не забудьте закрыть порт после выполнения всех операций. Надеюсь, это поможет.

user2840470 ответил: 28 марта 2018 в 04:54
Спасибо за ваш ответ, но я сделал это, и я до сих пор не получил ответ от устройства. Любые другие предложения?
Michael O. ответил: 28 марта 2018 в 06:21
@ user2840470 проверьте, действительно ли ваше устройство использует /dev/ttyUSB0, а не 1 и т. д.