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?
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
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
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