Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Ожидание данных с com porta


Автор: ishimcity 21.6.2014, 08:20
Уважаемые друзья, подскажите как быть, мне требуется чтобы скриптик сидел и слушал постоянно порт а полученые данные писал в базу, но вот никак не могу разобраться

Код

#!/usr/bin/python
import serial
import MySQLdb
import time
db=MySQLdb.connect("localhost","root","пароль","mysql") // подключаюсь к БД
cursor = db.cursor()
serialport = serial.Serial('/dev/ttyUSB0', 9600) // принимаю данные с comport
while 1:
    a = serialport.readline() // чтение пакета 1
    b = serialport.readline() // чтение пакета 2

sql = '''INSERT INTO home (tem, hum) VALUES (%s, %s)''' % (b,a) // пишем в базу
cursor.execute(sql)
db.commit()
db.rollback()
db.close()
serialport.close()


И так что у меня получается , все виснет в большом нескончаемом цикле))), как мне побороть это чтобы програмулинка сидела считвала с порта и писала в базу?
Если я пишу так то 

Код

serialport = serial.Serial('/dev/ttyUSB0', 9600,timeout=0) // принимаю данные с comport


то тогда БД ругается

если я убираю while 1: то все читается и пишется в базу но затем программа завершает работу тоесть получается один проход

Автор: baldman88 23.6.2014, 09:23
Если судить по вашему коду, то цикл while будет выполняться вечно, то есть будут поочередно считываться переменные а и b, а вот до записи в бд дело никогда не дойдет. Это очень неудачное решение (использование бесконечного цикла), добавьте условие выхода из него. Ну и попробуйте сделать так:
Код
#!/usr/bin/python
import serial
import MySQLdb
import time
db=MySQLdb.connect("localhost","root","пароль","mysql") // подключаюсь к БД
cursor = db.cursor()
serialport = serial.Serial('/dev/ttyUSB0', 9600) // принимаю данные с comport
i = 0
while (i < 10):
    a = serialport.readline() // чтение пакета 1
    b = serialport.readline() // чтение пакета 2
    sql = '''INSERT INTO home (tem, hum) VALUES (%s, %s)''' % (b,a) // пишем в базу
    cursor.execute(sql)
    db.commit()
    db.rollback()
    i += 1
db.close()
serialport.close()

Так должно получиться 10 записей в базе.
Хотя я могу и ошибаться. И да, зачем вам модуль time?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)