Yeni: Yapay zekâ güvenlik duvarı tüm platformu izliyor ve her olayı sade bir dille açıklıyor. Nasıl çalıştığını görün

Yanıt: Pi ağ geçidinde 9 bitlik çok noktalı (multidrop) veri yolunu okumak: UART bunu gerçekten yapabilir mi?

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.

Measure twice, poll once.
Kabul edilen çözüm♥ 9