0

我目前正在尝试从串行连接记录数据。我正在使用 python 模块pyserial

从串行连接读取一行后,我想为其添加时间戳,然后将其写入文件。

这在大多数情况下都有效,但有时时间戳会出现在文件中线。离尾行字符很远。

这是我正在使用的代码片段:

self.serialconnection = serial.Serial(port=self.port, baudrate=115200,
                                      timeout=0)
def run(self):
 openfile = open(self.logfile, 'a')
 while not self.stoprequest.isSet():
  try:
    linefromserial = self.serialconnection.readline()
    if linefromserial:
      linefromserial = linefromserial.replace('\00', '')
      datenow = datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S   ")
      dated_linefromserial = datenow + linefromserial
      openfile.write(dated_linefromserial)
  except self.stoprequest.isSet():
    openfile.close()
    break

我没有对串行连接使用超时,因为我在单独的线程中运行它,并且我不希望它阻塞。

那么这种方法有什么明显的问题吗?如何确定问题是由于 readline() 方法未能按我的设想运行,还是文件写入问题?

4

2 回答 2

1

您依靠串行线路中的数据来包含换行符,您永远不会自己编写。串行数据也可能包含回车符(通常以与换行符相同的方式解释),您需要清除它们。

从串行数据中删除回车符(可选),并在编写时添加显式换行符:

linefromserial = linefromserial.rstrip('\n').replace('\00', '').replace('\r', '')
datenow = datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S")
openfile.write('%s   %s\n' % (datenow, linefromserial))

现在您总是在收到的每一行的末尾写一个换行符(即使 readline() 调用没有返回一个),并且您确定没有\r回车导致其他地方换行。

于 2012-08-13T09:44:32.027 回答
0

问题是您将超时设置为 0。这意味着当您执行 readline() 时,它将读取缓冲区中已经存在的任何数据,但不会等待 eol。

根据 readline() 的 PySerial API 文档 http://pyserial.sourceforge.net/pyserial_api.html#serial.FileLike.readline

“读取以行尾 (eol) 字符(默认为 \n)或直到超时终止的行。”

你说你在一个单独的线程中运行它,所以不清楚你为什么不希望它阻塞。

一种可能的解决方案是跟踪先前的读取是否被 eol 终止,然后才将时间戳添加到当前读取。

另一种解决方案是存储您读取的片段,直到您收到带有 eol 的片段,然后将片段组装成一整行,添加时间戳并写入日志文件。

于 2013-04-16T17:34:50.210 回答