Форум сайта python.su
Приветствую!
Подскажите, пожалуйста, если не сложно.
На компьютере нужно “слушать” COM порт,
на который периодически с интервалом в несколько минут приходят данные.
Нашел в сети пример работы скрипта с com-портом посредством pyserial. Отправляешь команду, возвращается ответ с порта.
А как поступить если нужно периодически порт слушать? И как понять, что пришли новые данные? Данные - это строка в 25 символов.
Не хотелось бы скрипт периодически по крону запускать, лучше б запустить его только один раз при загрузке системы, а дальше чтоб он сам “ловил” с порта данные и дальше писал куда я скажу.
Спасибо за помощь!
#! /usr/bin/env python
import time
import serial
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=38400,
timeout=10,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
ser.open()
ser.isOpen()
print 'Enter your commands below.\r\nInsert "exit" to leave the application.'
input=1
while 1 :
# get keyboard input
input = raw_input(">> ")
if input == 'exit':
ser.close()
exit()
else:
# send the character to the device
# (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
ser.write(input + '\r\n')
out = ''
# let's wait one second before reading output (let's give device time to answer)
time.sleep(1)
while ser.inWaiting() > 0:
out += ser.read(1)
if out != '':
print ">>" + out
Офлайн
Я, чесно говоря, эту библиотеку первый раз вижу и с СОМ-портом никогда не работал, но судя по коду вот эта часть:
while ser.inWaiting() > 0:
out += ser.read(1)
if out != '':
print ">>" + out
Офлайн
dartNNNПро while - это то понятно, но как сделать по умному, чтобы напрасно ресурсы не расходовать и к тому же не понятно, как в таком случае узнать что пришли новые данные…
Я, чесно говоря, эту библиотеку первый раз вижу и с СОМ-портом никогда не работал, но судя по коду вот эта часть:читает и выводит все, что приходит с СОМ-порта, соответственно если ее затолкать в “while 1:” , то будет оно выполняться вечно, пока кто-нибудь его не убьет.while ser.inWaiting() > 0:
out += ser.read(1)
if out != '':
print ">>" + out
Офлайн
Про while - это то понятно, но как сделать по умному, чтобы напрасно ресурсы не расходовать и к тому же не понятно, как в таком случае узнать что пришли новые данные…Тогда вам в сторону nonblocking() и select()
Офлайн
В поток запихнул и проверяешь на здоровье циклом.
Офлайн
Задачу решил, сделал через signal, каждую секунду считываю данные с порта и если они пришли - парсю и пишу в базу.
Всем спасибо!
Офлайн
а в винде эта библиотека работает?
Офлайн
qmanДа, нужно установить pyserial-2.5-rc2.win32.exe
а в винде эта библиотека работает?
Отредактировано (Март 23, 2010 17:24:38)
Офлайн