Yapay zekâ tarafından English dilinden çevrildi ·
Donanım tarafına yeniyim ama yıllarca yazılımda seri protokol çalıştım ve bunu parite ile taklit edebilirsiniz. 9. bit, parite bitinin olacağı yere gönderilir. Linux, CMSPAR bayrağı ile “stick” pariteyi destekler: PARENB|CMSPAR|PARODD ile parite biti her zaman 1 (mark), PARODD olmadan her zaman 0 (space) olur.Yani: mark pariteyi ayarla, adres baytını yaz, çıkana kadar bekle (tcdrain), space paritesine geç, veri baytlarını yaz. Python’da:
import termios, serial
CMSPAR = 0o10000000000
s = serial.Serial('/dev/ttyAMA0', 9600)
def set_bit9(on):
a = termios.tcgetattr(s.fd)
a[2] |= termios.PARENB | CMSPAR
a[2] = a[2] | termios.PARODD if on else a[2] & ~termios.PARODD
termios.tcsetattr(s.fd, termios.TCSADRAIN, a)
set_bit9(True); s.write(bytes([0x03])); s.flush()
set_bit9(False); s.write(bytes([0x10, 0x00]))
Alma tarafı daha zahmetli: PARMRK ve INPCK’yi açın; “yanlış” pariteli bir bayt 0xFF 0x00 önekiyle gelir ve bu, 9. bitini size söyler. 9600’de adres ve veri baytları arasındaki zamanlamada, geçişten kaynaklanan küçük bir boşluk oluşur; çoğu eski cihaz buna aldırmaz. PL011 UART’ı kullanın (disable-bt), mini UART’ı değil, çünkü mini UART’ta parite yoktur.Ardından her gösterge v1/gw/telemetry üzerinden bir alt öğe olarak gönderilir, örneğin {“scale-1”: {“values”: {“kg”: 12.45}}} gibi.
I’m new to the hardware side but I did serial protocol work in software for years, and you can fake this with parity. The 9th bit is sent where the parity bit would be. Linux supports “stick” parity through the CMSPAR flag: with PARENB|CMSPAR|PARODD the parity bit is always 1 (mark), without PARODD it’s always 0 (space).
So: set mark parity, write the address byte, wait for it to leave (tcdrain), switch to space parity, write the data bytes. In Python:
import termios, serial
CMSPAR = 0o10000000000
s = serial.Serial('/dev/ttyAMA0', 9600)
def set_bit9(on):
a = termios.tcgetattr(s.fd)
a[2] |= termios.PARENB | CMSPAR
a[2] = a[2] | termios.PARODD if on else a[2] & ~termios.PARODD
termios.tcsetattr(s.fd, termios.TCSADRAIN, a)
set_bit9(True); s.write(bytes([0x03])); s.flush()
set_bit9(False); s.write(bytes([0x10, 0x00]))
Receiving is the uglier half: turn on PARMRK and INPCK and a byte with the “wrong” parity arrives prefixed with 0xFF 0x00, which tells you its 9th bit. At 9600 the timing between the address and the data bytes gets a small gap from switching, most old devices don’t care. Use the PL011 UART (disable-bt), not the mini UART, the mini UART has no parity.
Then each indicator goes out as a child, something like {“scale-1”: {“values”: {“kg”: 12.45}}} on v1/gw/telemetry.

