我有一个运行 Raspbian 的 Raspberry Pi(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)
我有一个通过 USB 连接的串行输出设备(电表)。每分钟用 Python 脚本读取串行端口。
编辑:我期望的数据符合此标准:DSMR v3.0
每十秒提供一次数据电报。 Python 脚本每分钟启动一次cron
以读取一个数据电报。
我的dmesg
,var/log/messages
和/var/log/syslog
正被这些淹没:
Nov 2 10:32:07 electron kernel: [151762.159243] ttyUSB0: 2 input overrun(s)
我已经调整好了/etc/rsyslog.conf
。通过删除,*.=kern;
我成功地抑制了这些消息进入/var/log/messages
.不幸的是,dmesg
并/var/log/syslog
继续显示这些消息。
/var/log/syslog
中没有提到/etc/rsyslog.conf
。它是由不同的机制提供的吗?如何抑制这些消息从 ttyUSB0 进入dmesg
和/var/log/syslog
?
对于那些担心可能在 Python 脚本中找到原因的人(任何改进都值得赞赏)。这是我使用的脚本(省略数据后处理):
#! /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()
编辑:我做了一些额外的测试。恰好在上述程序完成后发生输入溢出错误。我尝试port.XOFF()
在 之前添加port.close()
,但这没有帮助。
EDIT2:我尝试在命令周围插入serial.XON
and 。但是,这没有帮助。serial.XOFF
port.read(1)
答案1
由于我不再遇到这个问题,我想分享我的解决方案:
我已经对 Python 脚本进行了守护进程。这使我能够在脚本启动时打开串行连接,然后每十秒读取一次串行端口数据。
从此不再超支。
脚本的代码是在 GitHub 上
答案2
http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/
IT 帮助了我,我立即得到了解决方案。