pyserial parity bit abfragen / 9 bit frame

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
meinereins
User
Beiträge: 7
Registriert: Freitag 18. März 2011, 10:41

Hallo Forum,

ich versuche gerade, ein neuntes Datenbit in die Serielle einzubauen, um effizient den Beginn meines Datenframes zu kennzeichnen. Auf der TX Seite klappts auch schon:

Code: Alles auswählen

import serial
ser = serial.Serial()
ser.baudrate = 3000000
ser.parity = serial.PARITY_MARK
# ser.parity = serial.PARITY_SPACE
ser.port = 3
ser.open()
ser.write(chr(0x55))
Ich muß also nur vor jedem write() das parity anpassen, was mich nicht weiter stört.

Ich weiß aber nicht, wo ich das parity eines soeben gelesenen Bytes auslesen kann.

Beim Empfangen hab ich ja das Problem, daß die parity-Einstellungen vom TX hier ja auch gelten... also kanns passieren, daß ich mitten im Empfang eines Bytes gerade das parity umdrehe. Eine parity-Überwachung (parity-error erkennen) hilft mir also nicht weiter (und ich wüßte auch gar nicht, wie das geht). Stattdessen würde es helfen, den tatsächlichen Wert des paritys des letzten gelesenen Bytes zu kennen. Weiß jemand, wo ich den herbekomme?

Vielen Dank!
meinereins
meinereins
User
Beiträge: 7
Registriert: Freitag 18. März 2011, 10:41

Hallo nochmal,

Ich hab auch grad mal versuchsweise mit even und odd parity Empfang gespielt. Dabei werden nur gültige bytes durchgelassen, die mit falscher Parität liefert read() erst gar nicht.
Anders bei mark/space parity: hier werden alle bytes durchgelassen, ohne Kontrolle... :K
An sich ja prima für mich, wenn nur das parity auch irgendwie greifbar wäre.

Aus den serial sourcen werd ich leider auch nicht so recht schlau. In serialwin32.py steht u.a.:

Code: Alles auswählen

    def _reconfigurePort(self):
        """Set communication parameters on opened port."""
.....
        if self._parity == PARITY_NONE:
            comDCB.Parity       = win32.NOPARITY
            comDCB.fParity      = 0 # Disable Parity Check
        elif self._parity == PARITY_EVEN:
            comDCB.Parity       = win32.EVENPARITY
            comDCB.fParity      = 1 # Enable Parity Check
        elif self._parity == PARITY_ODD:
            comDCB.Parity       = win32.ODDPARITY
            comDCB.fParity      = 1 # Enable Parity Check
        elif self._parity == PARITY_MARK:
            comDCB.Parity       = win32.MARKPARITY
            comDCB.fParity      = 1 # Enable Parity Check
        elif self._parity == PARITY_SPACE:
            comDCB.Parity       = win32.SPACEPARITY
            comDCB.fParity      = 1 # Enable Parity Check
        else:
            raise ValueError("Unsupported parity mode: %r" % self._parity)
Ich verstehe das so, daß auch mark und space gecheckt werden? Das widerspricht meinen Messungen.

Keine Ideen? Google lässt mich hier auch im Stich...

Danke
meinereins
Loulli
User
Beiträge: 1
Registriert: Montag 20. August 2018, 13:08

Partity-Bit auslesen geht mit Bit Banging über einen GPIO Pin und z.B. dem Modul PIGPIO.

Inspiriert habe ich mich hier: https://raspberrypi.stackexchange.com/q ... 4294#44294

Hier meine Code durch den das Parity Bit in einem zusätzlichen Byte ausgegeben wird. Das Ganze wird dann noch in eine Datei geschrieben.

Code: Alles auswählen

import time
import pigpio # http://abyz.me.uk/rpi/pigpio/python.html

RXD=4 # number of GPIO 

pi = pigpio.pi()

if not pi.connected:
	exit(0)

pigpio.exceptions = False # Ignore error if already set as bit bang read.

handle = pi.file_open("/home/pi/Documents/bit_bang_output.txt",pigpio.FILE_WRITE) #assuming that the file /opt/pigpio/access (yes without extension) contains a line /home/pi/Domcuments/* w

pi.bb_serial_read_open(RXD, 9600,9) # Set baud rate and number of data bits here. Reading 9 data bits will read the parity bit.

pigpio.exceptions = True

stop = time.time() + 5.0 # recording 5.0 seconds

while time.time() < stop:

	(count, data) = pi.bb_serial_read(RXD)
	if count:
		#print(data.hex(),end="")
		pi.file_write(handle, data.hex())

pi.bb_serial_read_close(RXD)

pi.stop()
Antworten