Python и Arduino(Serial). Не могу разобраться.

Eylont
Offline
Зарегистрирован: 24.04.2017

Написал скрипт на python с библиотекой Serial(PyCharm).Суть проста: питон отправляет (b'1') на порт, ардуино проверяет наличие данных на порте и, если нашла, начинает постоянно слать 1 в порт от себя и зажигает светодиод. (чисто тестовый код для поиски ошибки, смысла не ищите).

Итог: данные от ардуино не поступают(in_waiting возвращает 0). Почему - неизвестно.

Однако! Если то же самое запускать с консоли - все работает(!!). При первом запуске консоли спросило разрешение добавить питон в исклчюение брандмауэра. Скрипт запускал в том числе без брандмауэра и с админ правам непосредственно через PyCharm.

Код Arduio:

int SD = 7;

void setup() {
  pinMode(SD, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  if (Serial.available()>0)
  {
    Serial.println(1);                                          //через write тоже не работает.
    digitalWrite(SD, 1);
  }

}

Код Python(порт открыт):

import serial

ser = serial.Serial('COM4', 115200, dsrdtr=1, timeout=2, write_timeout=3)
print(ser.in_waiting)
ser.write(b'1')
print(ser.in_waiting)
print(ser.readline())
ser.close()

 

выводит:

0

0

b''

Eylont
Offline
Зарегистрирован: 24.04.2017

Это настолько нубский, или настолько неясный вопрос, что никто не отвечает?)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Наверное надо разбираться с этой строкой , меня смущает dsrdtr=1, но я в питоне нулевой

ser = serial.Serial('COM4', 115200, dsrdtr=1, timeout=2, write_timeout=3)
Eylont
Offline
Зарегистрирован: 24.04.2017

вычитал на каком то форуме. Человек писал, что надо подключать, ибо иначе(у него!) не пашет при схожей проблеме. на всякий случай оставил. Но, как бы то ни было, даже если 0 ставить, то ничего не изменится. Проверял.

 

Добавлю, что windows 7 и python 3.6

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Eylont пишет:

вычитал на каком то форуме. Человек писал, что надо подключать, ибо иначе(у него!) не пашет при схожей проблеме. на всякий случай оставил. Но, как бы то ни было, даже если 0 ставить, то ничего не изменится. Проверял.

А таймауты? Копать надо в эту сторону ))) или искать, кто-то на питоне здесь с сериалом работал, попробуйте через поиск

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Eylont пишет:

вычитал на каком то форуме. Человек писал, что надо подключать, ибо иначе(у него!) не пашет при схожей проблеме. на всякий случай оставил. Но, как бы то ни было, даже если 0 ставить, то ничего не изменится. Проверял.

А таймауты? Копать надо в эту сторону ))) или искать, кто-то на питоне здесь с сериалом работал, попробуйте через поиск

ser = serial.Serial("/dev/tty.usbserial-A700eRV8", 9600)
ser.setDTR(False)
time.sleep(1.5)

 

Eylont
Offline
Зарегистрирован: 24.04.2017

тайм ауты, по идее, настроены) Если судить по коду. Да и выполнение кода зависает как раз примерно на 2 секунды перед readline. Добавил in_waiting после редлайн - все так же 0.

Имхо, тут либо питон не может отправить на плату, либо плата не выполняет\не успевает выполнить свою программу, ибо тогда светодиод хотя бы загорался.

Все еще думаю на права у питона на запись в порт.

 

-----ДОБАВЛЕНО к скинутой ссылке. Странно, но если у меня открыт порт в ide arduino, то при запуске скрипта\консоли питона выдает, что отказано в доступе
serial.serialutil.SerialException: could not open port 'COM4': PermissionError(13, 'Отказано в доступе.', None, 5)

Что, вообще, по моему, логично. Но мб я ТС-а не понял.

-----ДОБАВЛЕНО2 понял, как он так делает. в настройке порта есть exclusive - эксклюзивные права доступа к порту. Попробовал сменить, но начало материться, что у меня вин32(на оф форуме питона тыкнул по большой копнке 3.6 и он поставил 32-х битную версию =_=" второй раз на это попадаюсь). Переустановлю на 64 бита и попробую ченить сделать.

-----ДОБАВЛЕНО3 код по ссылке устаревший. ser.setDTR(bool) = мой dsrdtr=(bool) и он по умолчанию False

Eylont
Offline
Зарегистрирован: 24.04.2017

хммм... нечто невразумительное. Запустил exeшник, которымставил 32 бита, удалил питон. запустил 64 бита - поставил. Установил все библиотеки иии.. вновь ошибка win32. винда 64(пиратка), PyCharm 64. Может библиотека?...

Полный репорт:

Traceback (most recent call last):
  File "C:/Users/I42/PycharmProjects/untitled2/1.py", line 3, in <module>
    ser = serial.Serial('COM4', 115200, dsrdtr=True, timeout=2.0, rtscts=False, xonxoff=False, exclusive=False)
  File "C:\Users\I42\AppData\Local\Programs\Python\Python36\lib\site-packages\serial\serialwin32.py", line 31, in __init__
    super(Serial, self).__init__(*args, **kwargs)
  File "C:\Users\I42\AppData\Local\Programs\Python\Python36\lib\site-packages\serial\serialutil.py", line 229, in __init__
    self.exclusive = exclusive
  File "C:\Users\I42\AppData\Local\Programs\Python\Python36\lib\site-packages\serial\serialwin32.py", line 473, in exclusive
    raise ValueError('win32 only supports exclusive access (not: {})'.format(exclusive))
ValueError: win32 only supports exclusive access (not: False)
 

 

serialwin32.py подозрительно)

 

Да. Serial 32 бита. Вот только... это стандартная библиотека. Удалил. Пип не нашел. Все не слава богу)

 

-----ДОБАВЛЕНО Это все таки не стандартная библиотека. Поставляется с пайсиреал. Пип2 на 2.7 тоже не ищет. На 3.6 и 3.4 нету. Попробую вручную скачать с http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyserial мб поможет

Eylont
Offline
Зарегистрирован: 24.04.2017

БИНГО! на винде пашет.

ser = serial.Serial('COM4', 115200, dsrdtr=False, timeout=2.0, rtscts=True, xonxoff=False)

дср поставил фолс, а ртс тру и заработало. Значит дср не поддерживается виндой.
 

 

-- Изменил код на

import serial

ser = serial.Serial('COM4', 115200, timeout=2.0,  xonxoff=False)
print(ser.in_waiting)
ser.write(b'1')
print(ser.in_waiting)
for i in range(10):
    print(ser.readline())
print(ser.in_waiting)
ser.close()

и все равно пашет. Странно) может дело в версии питона. щас на 3.5 запускал, а до этого 3.6

 

 

а не, нифига, это я прогу в ардуинку не ту загрузил =\