Im usando pyserial per elaborare alcuni dati che vengono trasmessi su un'interfaccia seriale con 1.25MBaud. Im utilizzando un filo molto semplice per raccogliere i dati:PySerial: danneggiamento dei dati nei primi 256 byte
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))
Se leggo ed elaborare i dati ottengo allways un byte di sbagliato nei primi 256 byte. Uno dei messaggi che sono normali 8 byte è lungo 9 byte e non ho idea da dove provenga questo byte aggiuntivo. Se avvio il mittente dopo aver avviato il ricevitore, non vengono trasmessi byte errati. L'unica soluzione finora che funziona è quella di commentare nella riga self.serial.read(256)
. Dopo di ciò, non si verificano errori anche se leggo molti dati.
C'è un'altra soluzione oltre a saltare i primi messaggi?
Non credo che il rumore. Perché dovrebbe esserci rumore durante i primi 256 byte e mai dopo? E non posso semplicemente impostare le battute su due, questo non corrisponderebbe alle impostazioni specificate dal mittente. – jrast
Ci sono cose come l'induttanza parassita (I) e la capacità (C) e, a causa di esso, il rumore è maggiore all'inizio della trasmissione quando la linea inizia a cambiare I e C cambiando la tensione. Fondamentalmente ci saranno oscillazioni più grandi in linea all'inizio della trasmissione. Per dimostrarlo o eliminarlo hai bisogno dell'oscilloscopio digitale. Ma in ogni caso, secondo la mia esperienza, hai bisogno di 2 stop bit a tale velocità di trasmissione – cy8g3n
Puoi anche provare a comprare un buon cavo USB di alta qualità, ma non è garantito che funzioni perché il problema potrebbe essere nella periferica del chip. – cy8g3n