2014-07-03 10 views
5

Im używać pyserial do przetwarzania niektórych danych, które są transmitowane przez interfejs szeregowy z 1,25MBaud. Im przy użyciu bardzo prosty gwint do zbierania danych:PySerial: Korupcja danych w pierwszych 256 bajtach

class SerialReadThread(StoppableThread): 

    def __init__(self, port): 
     super(SerialReadThread, self).__init__() 
     self.serial = s.Serial(
      port=port, 
      baudrate=1250000, # 1.25 MBaud 
      bytesize=s.EIGHTBITS, 
      parity=s.PARITY_NONE, 
      stopbits=s.STOPBITS_ONE, 
      timeout=0.5 # Do not wait longer than a half second for next message 
     ) 
     self.data = [] 

    def run(self): 
     # Discard old Buffer Data 
     self.serial.flushInput() 
     #self.serial.read(256) 
     while not self.stopped(): 
      data = self.serial.read(64) 
      self.data.append(data) 
      log.debug(":".join("{:02x}".format(ord(c)) for c in data)) 

Jeśli czytam i przetwarzać dane dostaję zawsze dobrze jeden zły bajt w pierwszych 256 bajtów. Jedna z wiadomości, które normalnie 8 bajtów ma 9 bajtów i nie mam pojęcia, skąd pochodzi ten dodatkowy bajt. Jeśli uruchomię nadajnik po uruchomieniu odbiornika, nie zostaną wysłane błędne bajty. Jedynym rozwiązaniem do tej pory działającym jest komentarz w linii self.serial.read(256). Po tym nie pojawiają się żadne błędy, nawet jeśli czytam dużo danych.

Czy istnieje inne rozwiązanie niż tylko pomijanie pierwszych wiadomości?

Odpowiedz

0

To prawdopodobnie tylko trochę hałasu na linii. Zwykle w przypadku transmisji większych niż 115200 potrzeba 2 bitów stopu, więc będzie to:

stopbits=s.STOPBITS_TWO 
+0

Nie sądzę, że hałas. Dlaczego powinien występować szum podczas pierwszych 256 bajtów i nigdy potem? I nie mogę po prostu ustawić stopbits na dwa, to nie pasuje do ustawień określonych przez nadawcę. – jrast

+0

Są takie rzeczy jak pasożytnicza indukcyjność (I) i pojemność (C) iz tego powodu szum jest większy na początku transmisji, kiedy linia zaczyna zmieniać I i C przez zmianę napięcia. Zasadniczo na początku transmisji będą występować większe oscylacje na linii. Aby to udowodnić lub obalić, potrzebujesz cyfrowego oscyloskopu. Ale w każdym razie z mojego doświadczenia potrzebujesz 2 bitów stopu przy takiej szybkości transmisji. – cy8g3n

+0

Możesz także spróbować kupić dobrej jakości przewód USB o wysokiej jakości, ale nie gwarantuje, że zadziała, ponieważ problem może dotyczyć urządzenia peryferyjnego. – cy8g3n