Python soros port értékének vizsgálata
2020-12-29T17:25:59+01:00
2021-01-02T11:07:42+01:00
2022-08-11T23:50:35+02:00
wizkid
Sziasztok!

Az alábbi kóddal szeretném vizsgálni, hogy ha a joined_seq == "alma" , akkor írja ki hogy igen.

De nem akar működni a feltétel. Mit rontok el?
import serial import time ser = serial.Serial( port='/dev/serial0',\ baudrate=9600,\ parity=serial.PARITY_NONE,\ stopbits=serial.STOPBITS_ONE,\ bytesize=serial.EIGHTBITS,\ timeout=0) print("connected to: " + ser.portstr) #this will store the line seq = [] count = 1 while True: for c in ser.read(): seq.append(chr(c)) #convert from ANSII joined_seq = ''.join(str(v) for v in seq) #Make a string from array if chr(c) == '\n': print("Line " + str(count) + ': ' + joined_seq) if(joined_seq == "alma"): print("IGen") seq = [] count += 1 break ser.close()
Mutasd a teljes hozzászólást!
Ha CR-LF-et küld a másik oldal, akkor nálad "alma\r\n" lesz, nem "alma\n". De a legtisztább az lenne, ha kiíratnád a fogadott adatot valami olyan formában, amiben a vezérlőkarakterek is simán látszanak, amire pookie2 is utalt. Mondjuk a joined_seq helyett/mellett írd ki a repr(joined_seq)-et is, és egyből könnyen láthatóvá válik mindenféle vezérlőkarakter.
Mutasd a teljes hozzászólást!

  • Egyébként tényleg "alma" van benne, vagy csak almának tűnik?
    Pl. nincs az elején/végén valami egyéb (nem látható) karakter?
    Mutasd a teljes hozzászólást!
  • Először hozzáfűzöd az eddig olvasott adatokhoz azt, amit most olvastál, aztán megnézed, hogy az olvasott karakter újsor-e. Így garantáltan igaz, hogy az if-be belépéskor a joined_seq újsorra fog végződni, tehát maximum "alma\n" lehet, "alma" semmiképpen.

    Vagy "alma\n"-re vizsgáld a joined_seq értékét, vagy a hozzáfűzést csak akkor végezd el, ha nem újsort olvastál (else ág).
    Mutasd a teljes hozzászólást!
  • A linux parancssorba ezt írja ki : Line 2: alma úgyhogy gondolom alma van benne tényleg.

    Bár valamit még berak mögé, mert a soros portos programban van egy CR-LF is. Ha ezt kiveszem, akkor nem is küldi el az adatokat.
    Mutasd a teljes hozzászólást!
  • Vagy mondjuk van a végén egy \n, amit Csaboka2 írt (és amit ugye nem látsz).
    Teszteld ki ezzel (debug amúgy nincs?):

    print("Line " + str(count) + ': ' + joined_seq + "van itt meg valami?")
    Mutasd a teljes hozzászólást!
  • Így ezt írja ki :

    Line 1: alma van itt meg valami?

    Nem tudom, nagyon felületesen ismerem csak a python nyelvet. Nem is tudom hogy lehet itt debug-olni.
    Mutasd a teljes hozzászólást!
  • "alma\n" - re se teljesül a feltétel.
    Mutasd a teljes hozzászólást!
  • Ha CR-LF-et küld a másik oldal, akkor nálad "alma\r\n" lesz, nem "alma\n". De a legtisztább az lenne, ha kiíratnád a fogadott adatot valami olyan formában, amiben a vezérlőkarakterek is simán látszanak, amire pookie2 is utalt. Mondjuk a joined_seq helyett/mellett írd ki a repr(joined_seq)-et is, és egyből könnyen láthatóvá válik mindenféle vezérlőkarakter.
    Mutasd a teljes hozzászólást!
  • Köszönöm mindkettőtöknek. Működik.
    Mutasd a teljes hozzászólást!
  • Szia!

    A strip() függvénnyel egyszerűen le lehet vágni egy string elején és végén lévő whitespace karaktereket (space, tab, új sor, kocsi vissza).
    Mindig használnom stringek összehasonlításakor, és így biztosan nem zavarnak be a nem látható karakterek, enterek.

    if(joined_seq.strip() == "alma")

    Sőt, ha nem akarom, hogy case sensitiv legyen a kód, akkor a vizsgálandó stringre ráküldök egy upper() függvényt, így bármilyen formában (kis- vagy nagybetű) érkezik adat, akkor is lesz egyezés.

    if(joined_seq.strip().upper() == "ALMA")


    Amúgy a kódod egyértelműen elárulja a hibát, hiszen az append() van legelől, és csak azt követően van a "\n" vizsgálata.
    Ha előbb lenne vizsgálva az új sor karakter (esetleg még a kocsi vissza is), akkor nagyobb eséllyel egyezne a két karakterlánc.


    Plusz javaslat: Ez az egész megoldható lenne egy ser.readline() függvénnyel, ami visszaadja stringként a sorosport memóriájában lévő következő egész sort. A karakterek számát pedig a len() függvénnyel meg lehet határozni.
    Ha pedig az összes, a sorosport memóriájában lévő sort meg akarjuk kapni egyszerre, akkor a ser.readlines() paranccsal lehet lekérni, ami a sorokat egy tömbként adja vissza, tehát az adott sorra a tömb adott elemeként lehet hivatkozni.
    Mutasd a teljes hozzászólást!
  • Uhh , köszönöm szépen. Pont ezek kellenek nekem :)
    Mutasd a teljes hozzászólást!
abcd