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

Pi geçidinde 9 bitlik çok noktalı (multidrop) veri yolu okumak: UART bunu gerçekten yapabiliyor mu?

Pi geçidinde 9 bitlik çok noktalı (multidrop) veri yolu okumak: UART bunu gerçekten yapabiliyor mu?

Çözüldü 6 5

Yapay zekâ tarafından English dilinden çevrildi ·

Gıda ve içecek tesisi, eski dolum hattı. Dört tartı göstergesi, 90’lardan kalma özel bir RS-485 çok noktalı veri yolu üzerinden haberleşiyor: 9600 baud, 9 veri biti; 9. bit bir adres baytını işaret ediyor. Bunları sorgulayan orijinal PLC arızalanıyor ve ben, sorgulamayı devralıp her göstergeyi Hermetry’ye ayrı bir cihaz olarak bildirmesi için RS-485 HAT takılı bir Pi 4 kullanmak istiyorum.Hermetry kısmını sanırım anlıyorum: Pi bir geçit (gateway) olarak çalışıyor ve dört göstergeyi alt cihaz olarak içeren v1/gw/telemetry mesajını gönderiyor. Bilmediğim şey, Linux UART’ından 9 bitlik çerçeveleri nasıl alacağım. pyserial yalnızca 5 ila 8 veri bitini destekliyor. Bu Pi’de hiç mümkün mü, yoksa farklı donanım mı gerekir?

♥ 2

Yapay zekâ tarafından English dilinden çevrildi ·

9. bit tam olarak ne için kullanılıyor? Ben yalnızca 8N1 gördüm.

♥ 1

Yapay zekâ tarafından English dilinden çevrildi ·

Ne sıklıkta okumaya ihtiyacınız var? Eğer yavaşsa, birçok geçici çözüm kabul edilebilir hale gelir.

QoS 1 and a lot of patience.
♥ 2

Yapay zekâ tarafından English dilinden çevrildi ·

Gösterge başına saniyede bir kez yeterli. David, 9. bit her düğüme “bu bayt bir adres, uyan ve bunun kendisine ait olup olmadığını kontrol et” der. Veri baytlarında bu bit 0’dır.

♥ 0

Yapay zekâ tarafından English dilinden çevrildi ·

Birçok STM32 9 biti doğal olarak destekler. Pi için 8 bitlik seri veriye çeviren bir köprü olarak Blue Pill kullanmak, en sıradan ama en güvenilir yanıt olurdu.

♥ 0

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

Yapay zekâ tarafından English dilinden çevrildi ·

Kevin, çalışıyor. Adres baytı mark ile, veri space ile gönderiliyor, alıcı tarafta PARMRK. Göstergeler 1, 2 ve 4 ilk denemede yanıt verdi; 3 numaralı olan adresten sonra 2 ms boşluk istedi, onu ekledim. Alt cihazlar ilk v1/gw/telemetry mesajında Hermetry’de göründü. Hat ekibi şikayet ederse Jason’ın STM32 fikrini B planı olarak saklıyorum.

♥ 0
7 yazı görüntüleniyor – 1 ile 7 arası (toplam 7)
  • Bu konuyu yanıtlamak için giriş yapmış olmalısınız.

Sohbete katılın

Soru sormak ve yanıtlamak, yararlı gönderileri beğenmek ve sorununuzu çözen yanıtı işaretlemek için oturum açın. Her katkı puan ve seviye kazandırır.

Paylaş