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

USB-RS232 terazi indikatörü Pi’de: izin hatası, ttyUSB0/ttyUSB1 değişiyor, readline takılıyor

USB-RS232 terazi indikatörü Pi’de: izin hatası, ttyUSB0/ttyUSB1 değişiyor, readline takılıyor

Çözüldü 6 5

Selam. Depoda bir tartı indikatörümüz var (RS232 çıkışlı, sürekli ağırlık basıyor). Raspberry Pi 4’e USB-RS232 çevirici ile bağladım, amacım ağırlığı Python ile okuyup MQTT ile Hermetry’ye göndermek. Pi’de Raspberry Pi OS Lite, Python 3.11, pyserial 3.5.

İlk denemede şu hatayı aldım:

serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0:
[Errno 13] Permission denied: '/dev/ttyUSB0'

Kod basit:

ser = serial.Serial('/dev/ttyUSB0', 9600)
while True:
    line = ser.readline()
    print(line)

Ne yapmam lazım? Bir de ileride bu servis olarak kendi kendine çalışacak, ona göre önerirseniz sevinirim.

♥ 0

sudo ile çalıştırınca oluyor mu? Bende öyle olmuştu.

♥ 0

Olur ama servisi root ile çalıştırma. Kullanıcıyı dialout grubuna ekle: sudo usermod -aG dialout $USER, sonra çıkış yapıp tekrar gir.

Sahadan selamlar.
♥ 0

dialout ile izin sorunu gitti, teşekkürler. Ama iki yeni dert: Pi’yi yeniden başlatınca bazen ttyUSB1 oluyor (aynı Pi’de bir de USB-RS485 var), ve readline bazen sonsuza kadar bekliyor, hiçbir şey basmıyor. Terminal programında indikatör verisi akıyor ama.

♥ 0

İkisini de yaşadım, bir kantar projesinde.

Port adı: ttyUSB numarası takılma sırasına göre veriliyor, güvenme. ls -l /dev/serial/by-id/ ile bak, orada çeviricinin seri numaralı kalıcı adı var, onu kullan. Aynı çipten iki tane varsa ve seri numaraları yoksa udev kuralıyla USB portuna göre isim verirsin, ama çoğu zaman by-id yetiyor.

readline: varsayılan olarak
bekliyor. Çoğu indikatör satırı
ile bitiriyor, o yüzden hiç dönmüyor. Bir de timeout vermezsen kablo çıktığında da sonsuza kadar bekler. Benim kullandığım:

PORT = '/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A10K3XYZ-if00-port0'
ser = serial.Serial(PORT, 9600, bytesize=8, parity='N', stopbits=1, timeout=2)
buf = b''
while True:
    chunk = ser.read(64)
    if not chunk:
        continue          # 2 sn veri yok, burada log yaz
    buf += chunk
    while b'
' in buf:
        line, buf = buf.split(b'
', 1)
        w = parse_weight(line)   # örn. b'ST,GS,+0012.45kg'
        if w is not None:
            client.publish('v1/telemetry', json.dumps({'weight_kg': w}), qos=1)

İndikatör saniyede birkaç kez basıyorsa her satırı gönderme. Hermetry’de cihaz başına varsayılan limit saniyede 10 mesaj, üstü sessizce düşüyor. Saniyede bir, ya da sadece ST (stabil) satırlarını yolla. Servis için systemd unit yaz, User= satırına kendi kullanıcını koy, Restart=always.

Ağ geçidi yine bağlanıyor…
Kabul edilen çözüm♥ 5

Satır sonu gerçekten
imiş, hexdump ile baktım. by-id ile port sorunu da bitti. Şimdi sadece stabil okumaları saniyede bir yolluyorum, systemd ile 2 gündür sorunsuz. Sağ olun.

♥ 0

CH340’lı ucuz çeviricilerde seri numarası olmuyor, by-id’de ikisi aynı görünür. O durumda /dev/serial/by-path/ kullanın, USB portuna bağlı kalıyor.

♥ 1
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ş