Python и Arduino(Serial). Не могу разобраться.
- Войдите на сайт для отправки комментариев
Написал скрипт на 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''
Это настолько нубский, или настолько неясный вопрос, что никто не отвечает?)
Наверное надо разбираться с этой строкой , меня смущает dsrdtr=1, но я в питоне нулевой
вычитал на каком то форуме. Человек писал, что надо подключать, ибо иначе(у него!) не пашет при схожей проблеме. на всякий случай оставил. Но, как бы то ни было, даже если 0 ставить, то ничего не изменится. Проверял.
Добавлю, что windows 7 и python 3.6
вычитал на каком то форуме. Человек писал, что надо подключать, ибо иначе(у него!) не пашет при схожей проблеме. на всякий случай оставил. Но, как бы то ни было, даже если 0 ставить, то ничего не изменится. Проверял.
А таймауты? Копать надо в эту сторону ))) или искать, кто-то на питоне здесь с сериалом работал, попробуйте через поиск
вычитал на каком то форуме. Человек писал, что надо подключать, ибо иначе(у него!) не пашет при схожей проблеме. на всякий случай оставил. Но, как бы то ни было, даже если 0 ставить, то ничего не изменится. Проверял.
А таймауты? Копать надо в эту сторону ))) или искать, кто-то на питоне здесь с сериалом работал, попробуйте через поиск
тайм ауты, по идее, настроены) Если судить по коду. Да и выполнение кода зависает как раз примерно на 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
хммм... нечто невразумительное. Запустил 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 мб поможет
БИНГО! на винде пашет.
дср поставил фолс, а ртс тру и заработало. Значит дср не поддерживается виндой.
-- Изменил код на
и все равно пашет. Странно) может дело в версии питона. щас на 3.5 запускал, а до этого 3.6
а не, нифига, это я прогу в ардуинку не ту загрузил =\