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 に答える