2016-03-03 2 views
0

У меня есть небольшая проблема с получением данных с помощью pySerial: он часто не читает полные данные или слишком много. Иногда, а иногда и чаще, появляются дополнительные символы или некоторые символы/части данных с пометками отсутствуют. Кажется, ПК и эмиттер данных не синхронизированы правильно.PySerial не принимает данные правильно

В данном примере я использую Arduino, посылая «Hello World» к последовательному порту ПК (ОС Ubuntu 14,04), со следующим простым кодом:

void setup(){ 
    Serial.begin(9600); 
    Serial.print("Programme initiated\n"); 
} 

я использую следующий python3 код для получения данных:

import serial 
import time 

arduino = serial.Serial(port, baudrate=9600, timeout=2) 
print(arduino.isOpen) 
print(arduino) 
time.sleep(1)  

while True: 
    print(arduino.readline()) 

Это в значительной степени простой учебник пример, и вот что я получаю (кроме правильного материала):

b'PrProgramme initiated\n' 

или

b'PProgramme initiated\n' 

или

b'ProgProgramme initiated\n' 

или

b'ogramme initiated\n' 

я перешел на более сложные проблемы в моем коде, но я все еще не решил эту проблему. При отправке сообщения в цикле из arduino (стандартного кода hello world) часто требуется время для стабилизации (в то время как оно снова показывает только средний фрагмент данных), и после этого работает довольно стабильно, но даже тогда он иногда разбивает отдельные строки.

Я столкнулся с теми же трудностями при общении с мультиметровым устройством. Там он часто не считывает первые символы или не смешивается с предыдущими данными.

Неужели кто-нибудь сталкивался с этой проблемой раньше? Я думаю, что речь идет о синхронизации, но я не знаю, как ее решить. И то, что меня озадачивает, состоит в том, что я действительно использовал только материал учебника, и он, похоже, не работает должным образом. Или это проблема конфигурации моего ПК?

ответ

1

То, что вы смотрите, происходит потому, что происходят разные вещи.

Прежде всего, каждый раз, когда вы открываете последовательный порт, вы вызываете так называемые «авторешетки» и перезагрузку Arduino. Этого можно избежать в аппаратных средствах или даже в программном обеспечении, явно отключив сигнал RST при открытии. Как это может измениться и выходит за рамки вопроса.

Затем мы должны понимать, что серийный номер НЕ ожидает, что другая часть будет слушать передачу данных; поэтому, если вы отключите авторешетку и подключитесь к Arduino, вы увидите случайную часть выхода программы, в зависимости от ее текущего состояния.

Наконец, у нас есть возможность использования буфера на ПК (а иногда и на стороне UART на USB), поэтому неправда, что, если вы не слушаете, что данные теряются, они могут оставаться в буфере.

Можно сказать, что первые 3 артефакта могут быть заданы буферизованными данными + перезагрузка (это случается много, когда вы отправляете много данных, и это нарушает автозагрузку кода, и вы должны выполнять ручную процедуру), тогда как последнее может быть чем-то, что помешало заполнению буфера, возможно, оно было отключено вами, возможно, какое-то странное время, открывающее сериал, возможно, вы отключили авторешетку, возможно, время, когда ардуино получила перечисленную часть сообщения, исчезло.

+0

Спасибо за объяснение. Есть ли, в общем, способ очистить буфер до начала связи (так сказать, чтобы решить пункт 3)? – kire

+0

попробуйте с arduino.flushInput() сразу после открытия – Lesto

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