Eu tenho um Raspberry Pi executando o Raspbian (um sabor do Debian: Linux version 3.12-1-rpi ([email protected]) (gcc version 4.7.2 (Debian 4.7.2-5+rpi1) ) #1 Debian 3.12.9-1+rpi1 (2014-05-19)
).
Eu tenho um dispositivo de saída serial (medidor de eletricidade) conectado via USB. A porta serial é lida com um script Python a cada minuto.
EDIT: Os dados que estou esperando estão em conformidade com este padrão: DSMR v3.0
Um telegrama de dados é oferecido a cada dez segundos. O script Python é iniciado por cron
a cada minuto para ler um telegrama de dados.
Meus dmesg
, var/log/messages
e /var/log/syslog
estão sendo inundados por estes:
Nov 2 10:32:07 electron kernel: [151762.159243] ttyUSB0: 2 input overrun(s)
Eu ajustei /etc/rsyslog.conf
. Removendo *.=kern;
eu consegui suprimir essas mensagens indo em /var/log/messages
. Infelizmente, dmesg
e /var/log/syslog
continuam exibindo essas mensagens.
/var/log/syslog
é mencionado em nenhum lugar em /etc/rsyslog.conf
. É alimentado por um mecanismo diferente? Como posso suprimir essas mensagens de ttyUSB0 entrando em dmesg
e /var/log/syslog
?
Para aqueles preocupados que a causa pode ser encontrada no script Python (quaisquer melhorias são bem-vindas). Aqui está o script que eu uso (pós-processamento de dados omitidos):
#! /usr/bin/python
import sys, serial, re
port = serial.Serial()
port.baudrate = 9600
port.bytesize = serial.SEVENBITS
port.parity = serial.PARITY_EVEN
port.stopbits = serial.STOPBITS_ONE
port.xonxoff = 1
port.rtscts = 0
port.dsrdtr = 0
port.timeout = 0
port.port = "/dev/ttyUSB0"
def gettelegram():
# flag used to exit the while-loop
abort = 0
# countdown counter used to prevent infinite loops
loops2go = 40
# storage space for the telegram
telegram = []
# end of line delimiter
delim = "\x0a"
try:
port.open()
serial.XON
except:
abort == 4
# open error terminates immediately
return telegram, abort
while abort == 0:
try:
# this doesn't seem to work
#line = str(port.readline()).strip()
line = "".join(iter(lambda:port.read(1),delim)).strip()
except:
# read error, terminate prematurely
abort = 2
if line == "!":
abort = 1
if line != "":
telegram.append(line)
loops2go = loops2go - 1
if loops2go < 0:
abort = 3
# test for correct start of telegram
if telegram[0][0] != "/":
abort = 2
try:
serial.XOFF
port.close()
except:
abort == 5
# Return codes:
# abort == 1 indicates a successful read
# abort == 2 means that no valid data was read from the serial port
# abort == 3 indicates a data overrun. More lines were received than expected.
# abort == 4 indicates a serial port open error.
# abort == 5 indicates a serial port close error.
return (telegram, abort)
if __name__ == "__main__":
telegram, status = gettelegram()
EDIT: Eu fiz alguns testes extras. Acontece que o erro de ultrapassagem da entrada acontece APÓS o programa acima ter terminado. Eu tentei adicionar um port.XOFF()
antes do port.close()
, mas isso não ajuda.
EDIT2: Eu tentei inserir serial.XON
e serial.XOFF
em torno do comando port.read(1)
. Mas isso não ajudou.