Найти - Пользователи
Полная версия: Как периодически считывать данные с COM порта?
Начало » Python для новичков » Как периодически считывать данные с COM порта?
1
POLL
Приветствую!

Подскажите, пожалуйста, если не сложно.
На компьютере нужно “слушать” 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
Система: Ubunto, python 2.6.4rc2, pyserial-2.5-rc2
dartNNN
Я, чесно говоря, эту библиотеку первый раз вижу и с СОМ-портом никогда не работал, но судя по коду вот эта часть:
        while ser.inWaiting() > 0:
out += ser.read(1)

if out != '':
print ">>" + out
читает и выводит все, что приходит с СОМ-порта, соответственно если ее затолкать в “while 1:” , то будет оно выполняться вечно, пока кто-нибудь его не убьет. Ну а “писал куда я скажу” - проблем не вызовет.
POLL
dartNNN
Я, чесно говоря, эту библиотеку первый раз вижу и с СОМ-портом никогда не работал, но судя по коду вот эта часть:
        while ser.inWaiting() > 0:
out += ser.read(1)

if out != '':
print ">>" + out
читает и выводит все, что приходит с СОМ-порта, соответственно если ее затолкать в “while 1:” , то будет оно выполняться вечно, пока кто-нибудь его не убьет.
Про while - это то понятно, но как сделать по умному, чтобы напрасно ресурсы не расходовать и к тому же не понятно, как в таком случае узнать что пришли новые данные…
Ed
Про while - это то понятно, но как сделать по умному, чтобы напрасно ресурсы не расходовать и к тому же не понятно, как в таком случае узнать что пришли новые данные…
Тогда вам в сторону nonblocking() и select()
Griffon
В поток запихнул и проверяешь на здоровье циклом.
POLL
Задачу решил, сделал через signal, каждую секунду считываю данные с порта и если они пришли - парсю и пишу в базу.

Всем спасибо!
qman
а в винде эта библиотека работает?
POLL
qman
а в винде эта библиотека работает?
Да, нужно установить pyserial-2.5-rc2.win32.exe
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