Найти - Пользователи
Полная версия: Помогите найти ошибку Python 3.5.3+Arduino+2 Сервопривода
Начало » Python для новичков » Помогите найти ошибку Python 3.5.3+Arduino+2 Сервопривода
1 2
IVAN222
Выскакивает ошибка, в чем может быть дело?




>>>
=============== RESTART: C:\Новая папка (2)\SerialArduino3.py ===============
x_abs=18 y_abs=153
Traceback (most recent call last):
File “C:\Новая папка (2)\SerialArduino3.py”, line 46, in <module>
arduino.write(b“coordinate”)
File “C:\Users\IVAN\AppData\Local\Programs\Python\Python35-32\lib\site-packages\serial\serialwin32.py”, line 315, in write
raise SerialException(“WriteFile failed ({!r})”.format(ctypes.WinError()))
serial.serialutil.SerialException: WriteFile failed (PermissionError(13, ‘Отказано в доступе.’, None, 5))
>>>
PEHDOM
PermissionError же, попробуйте запускать “от имени администратор”
IVAN222
Что именно запускать от имени администратор Python , Arduino или что то другое?
PEHDOM
пайтон естевтвенно
В пытаетесь писать а СОМ порт, но вам не хватает прав для этого.
PermissionError(13, ‘Отказано в доступе.’, None, 5) это сообщение венды.
Вам нужно или повысить привилегии, или разраешить непривилегированым пользователям работать с СОМ портами…
Еще конечно может быть что порт уже ктото использует…
ЗЫ тут http://stackoverflow.com/questions/6032568/using-serial-on-python-win7 еще написано
что пролема может быть изза 64-х битного интерпретатора, на 32х битном все заработало..
IVAN222
как повысить привилегии, или разраешить непривилегированым пользователям работать с СОМ3.
PEHDOM
IVAN222
как повысить привилегии,
я же писал:
PEHDOM
попробуйте запускать “от имени администратор”
Венда начиная с висты устроена очень по хитрожопому, даже если вы входите в группу Администраторы, или работаете под учеткой Администратор вы нихрена не администратор. Чтобы стать полноценным администратором нужно запускать приграммы “от имени Администратора” (в контекстном меню любого ехе файла есть такой пункт “запустить от имени Админитсратора” ). Тогда выскочит хрень с заголовком “Контроль учетных записей бла бла бла…. Разрешить следующей программе бла бла ……” Соотвественно после нажатия “ДА” у вас появляеться уже полные права на работу с системой.
Соответвенно первым делом проверте запустив пайтон “от имени….” и смотрите дальше по ситуации.
Отключив UAC у вас не будет выскакивать эта куйня, и при наличии прав Администратора вы будете иметь максимальные привилении.
Есть информация что достаточно дать права на ЗАПИСЬ И ЧТЕНИЕ ключу реестра HLM/HARDWARE/DEVICEMAP/SERIALCOM учетке под которой выполняется скрипт, но лично не проверял.
Если поможет - молодец, если не поможет - смотрите МБ какаято другая программа уже использует это порт, например это может быть arduino ide или ХЗ что у вас там еще крутиться.
Можно посмотреть утилитой PortMon от Sysinternals, но при этом нужно чтобы PortMon был запущен до того как какой-то драйвер занял порт ( например прописать запуск в шедуллера по событию system startup)
или же Утилитой Process Explorer. Поиск по строке Serial дает нам ссылку на процесс использующий файл типа \Device\Serial, где - номер устройства в системе. Например \Device\Serial0 - у меня указал на COM1.
Если первых два дейтвия не помогли , попробуйте поменять интерпертатор на х32 , если у вас х64
PEHDOM
тут http://stackoverflow.com/questions/6032568/using-serial-on-python-win7 еще написано
что пролема может быть изза 64-х битного интерпретатора, на 32х битном все заработало..

IVAN222
Давал полные права на работу, не хрена не помогло. Попробовал отключить провод с пина 11, оставил только пин 10 (Х) координата - работает, ошибки нет, но сервопривод дергается в одну сторону и похрену где лицо слева или справа, такая же хрень и с пином 11. Как только подсоединяю пин 10 и 11 - вылазит та же ошибка : x_abs=53 y_abs=54
x_abs=55 y_abs=18
x_abs=23 y_abs=30
x_abs=126 y_abs=53

Traceback (most recent call last):
File “C:\SerialArduino3.py”, line 44, in <module>
arduino.write(b“coordinate”)
File “C:\Users\IVAN\AppData\Local\Programs\Python\Python35-32\lib\site-packages\serial\serialwin32.py”, line 315, in write
raise SerialException(“WriteFile failed ({!r})”.format(ctypes.WinError()))
serial.serialutil.SerialException: WriteFile failed (PermissionError(13, ‘Отказано в доступе.’, None, 5))

Может выдавать координаты x_abs=53 y_abs=54 , одну строку и дать ошибку , а может 2,3,4,5 строк и потом дать ошибку (как вот сейчас на примере) , но сервопривод двигается плавно как надо, не дергается.
PEHDOM
хмм тогда единственное что еще приходит в голову, попробуйте понизить BAUDRATE с 115200 до 38400 как в скетче для ардуино так и в пайтон скрипте, посмотрите на результат.
Еще в скетчетнаписано
IVAN222
if(readString.indexOf(“coordinate”) >=0){
x=Serial.read();
delay(3);
y=Serial.read();
}
насколько я понимаю если ардуино получает строку “coordinate” он читает Х координату, ждет 3 милисекунды и потом читает Y координату
а теперь смотрим в .py
 arduino.write(bcoordinate)
arduino.write(a)
arduino.write(b)
тоесть пишем в порт coordinate потом пишем а и б
МБ так и надо, я не разбираюсь во всех тонкостях, но не нужно ли и в пайтоне ставить задержку?
или наоборот уменьшить/увеличить задержку в скетче?
ziro
Тут еще такая идея возникла. Вы пытаетесь работать с COM-портом на высоком уровне тупо записывая туда данные как в файл. Но на самом деле, насколько я помню, в винде нет гарантии, что данные - которые вы записываете в порт тут же и отправятся - вполне может быть какая-нибудь задержка. Как следствие, возможны коллизии, когда Вы пытаетесь записать новые данные в порт, но старые еще не отправлены.

Попробуйте проверить, не исчезнет ли проблема, если Вы снизите частоту отправки данных, то есть какие нибудь таймауты поставите, например time.sleep(1) после arduino.write(b).

Ясно, что это никоим образом не рабочий вариант, но если такая проверка сработает, то будет примерно понятно в каком направлении “копать”.
IVAN222
BAUDRATE понизил до 9600 , так и оставил, не чего не дало.

задержку ставил от 0.05 до 1.
time.sleep(1) после arduino.write(b)

в скече то же разную ставил.
if(readString.indexOf(“coordinate”) >=0){
x=Serial.read();
delay(3);
y=Serial.read();
результат без изменений.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB