2014-12-23 4 views
1

Я очень сожалею, что задал еще один вопрос здесь через день.Python: serial.readline() - как определить EOL от n до n n

Новая проблема в деталях: Я подключил лазерный дальномер от HOKUYO к моему RaspBerryPi.

соединения и т.д. работы найти, благодаря serial.py

Моя единственная проблема Ist, Венна Я посылаю команду, я получаю эхо и метку времени + \ п назад.

Данные в буфере выглядит следующим образом:

MD000007200001\n 
2Dh1\n 
\n\n 

После этого датчик передает измерение, которое блокирует как

MD000007200001\n 
2Dh1\n 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
..... 
... 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
\n\n 

читать эти данные, на данный момент я использую ReadAll(). Также попробовал readlines(). В обоих случаях у меня возникла проблема, которая должна подождать до тайм-аута, который был установлен на 1. Это занимает слишком много времени для приложения в реальном времени и того факта, что этот датчик может измерять каждые 120 мс. Если я установил таймаут в 0, я часто пропускаю некоторые данные, и все рушится, потому что мне нужен весь набор данных для моего caluclation.

Я также читал, что существует возможность установить EOL для readline как readline (eof = '\ n \ n'), но с Python 3.x это не сработает.

Кажется, есть второй вариант, на котором написана моя функция readline.

Но я являюсь абсолютным новичком в питоне. поэтому я не знаю, с чего начать.

Уместно есть некоторые дополнительные опции.

С уважением, А.

+0

shd легко адаптировать ответы по адресу http://stackoverflow.com/questions/16470903/pyserial-2-6-specify-end-of-line-in-readline - те, кто искали EOL ' \ r', вы ищете '\ n \ n', но в остальном это похоже на ту же проблему. Вам это нужно более подробно изложить? –

+0

это было бы круто, да. i уже прочитал этот ответ, но не смог реализовать свою собственную функцию readline(); – AndyA

ответ

2

Адаптирование ответа на pySerial 2.6: specify end-of-line in readline() (который также предлагает альтернативу), можно было бы написать такую ​​функцию, как:

def readline(a_serial, eol=b'\n\n'): 
    leneol = len(eol) 
    line = bytearray() 
    while True: 
     c = a_serial.read(1) 
     if c: 
      line += c 
      if line[-leneol:] == eol: 
       break 
     else: 
      break 
    return bytes(line) 

a_serial должен быть serial.Serial экземпляра построен с соответствующими параметрами, конечно - например, , значение по умолчанию timeout из None может привести к тому, что он будет блокироваться неограниченно, если нужный маркер eol не поступит. Это не кажется проблемой для ОП, если я правильно прочитал вопрос, но - что-то, о чем нужно знать в общих случаях.

+0

Thx, вот и все. Кажется, я пропустил ответ от pySerial 2.6: укажите конец строки в readline(); Я думал, что мне пришлось изменить существующую функцию readline из pyserial lib. – AndyA

+0

Отличное решение! Это отлично работает для меня. – bretcj7

0

Вы должны установить тайм-аут, чтобы 0.12 (или все, что вы хотели бы сделать это «в реальном времени») и использовать readall(). Затем, у вас есть несколько вариантов:

  1. Если вы хотите как \n и \n\n посчитать как разделитель, вызовите replace("\n\n", "\n") по данным из readall() и разделить его на линию сам по телефону split("\n").
  2. Если вы хотите только \n\n посчитать как разделитель, просто позвоните split("\n\n") по данным от readall().
+0

thx для этой информации, но дело в том, что я не хочу никаких временных зависимостей; лучшим способом было бы, когда есть возможность читать из буфера с помощью readline до \ n \ n. – AndyA

+0

Ну тогда установите «тайм-аут» на 0. См. Документы: http://pyserial.sourceforge.net/pyserial_api.html#serial.Serial.__init__ –

Смежные вопросы