Здравствуйте, возможно ошибусь разделом (тогда прошу перенести), но я новичок в программировании на питоне и поэтому пишу тут.
Есть Ubuntu 12.04, Python 2.7.3, Apache/2.2.22 в составе LAMP сервера. Надо сделать чтобы из веб странички пользователь мог отправлять и принимать данные с ком порта. Решено было взять питон. Апач настраивать долго не пришлось - он уже умеет питон скрипты выполнять. Все уже настроено - страничка работает, скрипты в cgi папке и т д . скрипт выполняется по протоколу cgi.
скрипт простенький:
#!/usr/bin/env python
import serial
import cgi
import cgitb
import os
import sys
print (“STATUS: 200 OK\n\n”)
req = cgi.FieldStorage();
getdata = req.getvalue('c')
ser = serial.Serial('/dev/ttyACM0',9600,dsrdtr = 1,timeout = 0)
ser.open()
portisopen = ser.isOpen()
print(portisopen)
print(getdata)
ser.write(getdata)
readline = ser.readline()
print(readline)
ser.close()
создаем файл с расширением .py и в консольке делаем его исполняемым sudo chmod +x file.py …
из веб странички приходят данные (по средствам get или post jquery), затем все отправляется на виртуальный ком порт …
Скрипт не совсем корректно работает (данные теряет или вообще криво выполняется - данные на ком приходят но не те, что посылались). Еще данные с ком порта не приходят или искажаются. Если параллельно со скриптом открыть монитор порта (прога для общения с ком портом) то все работает как надо но данные прочитанные с ком порта приходят в прогу, а не на веб страничку.
Также часто виртуальный порт не работает из-за прав (делаю ему sudo chmod 777 -R /dev/ttyACM0 )
все работает, но не долго через перезагрузку снова может права затребовать….
вот кусочек лога ошибок апача, когда есть проблемы с правами:
Traceback (most recent call last):, referer: http://127.0.0.1/
File “/home/kain/www/cgi/py.py”, line 12, in <module>, referer: http://127.0.0.1/
ser = serial.Serial('/dev/ttyACM0',9600,dsrdtr = 1,timeout = 0), referer: http://127.0.0.1/
File “/usr/local/lib/python2.7/dist-packages/serial/serialutil.py”, line 260, in __init__, referer: http://127.0.0.1/
self.open(), referer: http://127.0.0.1/
File “/usr/local/lib/python2.7/dist-packages/serial/serialposix.py”, line 276, in open, referer: http://127.0.0.1/
raise SerialException(“could not open port %s: %s” % (self._port, msg)), referer: http://127.0.0.1/
serial.serialutil.SerialException: could not open port /dev/ttyACM0: Permission denied: ‘/dev/ttyACM0’, referer: http://127.0.0.1/
Собственно html страничка:
<!DOCTYPE html>
<html>
<head>
<title>HTML python test</title>
</head>
<body>
<h1>HTML python test</h1>
<script src=“jquery-1.9.1.min.js”>
</script>
<script>
var Com = function(command, callback, data){
$.get('http://10.42.0.1/cgi/py.py',{
c:command
}, callback);
function callback(data)
{
alert(data);
}
}
</script>
<button onclick=“Com(0)”>COM = 0;</button>
<button onclick=“Com(1)”>COM = 1;</button>
</body>
</html>
Если запустить скрипт в ipython то все работает как надо! пробовал с более простым скриптом:
#!/usr/bin/env python
import serial
print (“STATUS: 200 OK\n\n”)
ser = serial.Serial('/dev/ttyACM0',9600,dsrdtr = 1,timeout = 0)
ser.open()
portisopen = ser.isOpen()
print(portisopen)
print(getdata)
ser.write(1)
readline = ser.readline()
print(readline)
ser.close()
Он аналогичен, но работает. Еще пробовал openCV (чей-то проект с хабра,кажется) тоже через ipython работает, просто как скрипт нет.
Вопросы:
1) что не так?
2) как сделать, чтобы скрипт выполнялся через ipython?
3) почему через ipython все работает, а через стандартный shell питона нет?
4) возможно скрипт кривой, или я чего не понял?
5) у кого есть опыт работы с pySerial, подскажите…
6) простите, но я не умею под кат прятать ( если кто научит спрячу код под кат)