Como suprimir mensagens de saturação de entrada

2

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.

    
por Mausy5043 02.11.2014 / 10:42

2 respostas

0

Como não tenho mais este problema, gostaria de compartilhar minha solução:

Eu daemonizei o script Python. Isso me permitiu abrir a conexão serial na inicialização do script e ler os dados da porta serial a cada dez segundos.

Não há mais excesso desde.

O código do script é aqui no GitHub

    
por 20.09.2015 / 16:43
-2

link

A TI me ajudou e consegui uma solução no instante.

    
por 19.12.2017 / 09:10