Уведомления

Группа в Telegram: @pythonsu

#1 Март 18, 2010 23:27:36

POLL
От:
Зарегистрирован: 2010-03-18
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как периодически считывать данные с COM порта?

Приветствую!

Подскажите, пожалуйста, если не сложно.
На компьютере нужно “слушать” 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



Офлайн

#2 Март 19, 2010 03:14:39

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Как периодически считывать данные с COM порта?

Я, чесно говоря, эту библиотеку первый раз вижу и с СОМ-портом никогда не работал, но судя по коду вот эта часть:

        while ser.inWaiting() > 0:
out += ser.read(1)

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



Офлайн

#3 Март 19, 2010 07:58:19

POLL
От:
Зарегистрирован: 2010-03-18
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как периодически считывать данные с COM порта?

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

if out != '':
print ">>" + out
читает и выводит все, что приходит с СОМ-порта, соответственно если ее затолкать в “while 1:” , то будет оно выполняться вечно, пока кто-нибудь его не убьет.
Про while - это то понятно, но как сделать по умному, чтобы напрасно ресурсы не расходовать и к тому же не понятно, как в таком случае узнать что пришли новые данные…



Офлайн

#4 Март 19, 2010 11:14:22

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Как периодически считывать данные с COM порта?

Про while - это то понятно, но как сделать по умному, чтобы напрасно ресурсы не расходовать и к тому же не понятно, как в таком случае узнать что пришли новые данные…
Тогда вам в сторону nonblocking() и select()



Офлайн

#5 Март 19, 2010 11:38:50

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Как периодически считывать данные с COM порта?

В поток запихнул и проверяешь на здоровье циклом.



Офлайн

#6 Март 20, 2010 17:24:56

POLL
От:
Зарегистрирован: 2010-03-18
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как периодически считывать данные с COM порта?

Задачу решил, сделал через signal, каждую секунду считываю данные с порта и если они пришли - парсю и пишу в базу.

Всем спасибо!



Офлайн

#7 Март 22, 2010 13:19:08

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

Как периодически считывать данные с COM порта?

а в винде эта библиотека работает?



Офлайн

#8 Март 23, 2010 17:23:11

POLL
От:
Зарегистрирован: 2010-03-18
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как периодически считывать данные с COM порта?

qman
а в винде эта библиотека работает?
Да, нужно установить pyserial-2.5-rc2.win32.exe



Отредактировано (Март 23, 2010 17:24:38)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version