logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Python: Zapis danych z czytnika RFID przez COM8 do pliku .txt

electric00 04 Cze 2019 10:10 2493 31
Najlepsze odpowiedzi

Jak w Pythonie zapisywać dane odczytane z czytnika RFID przez port COM8 do pliku .txt i dlaczego pojawiają się w nim błędne znaki oraz puste wpisy?

Dane z portu zapiszesz przez `open()`, ale w tym przypadku trzeba najpierw poprawnie odczytać i zinterpretować to, co przychodzi z czytnika, bo problem nie leży tylko w samym zapisie do pliku [#17995539] Czytnik MKEIA BxDesktop wysyła kod karty jako 5 bajtów binarnych, a nie jako ASCII, więc „krzaki” w pliku oznaczają złą interpretację danych, a nie błąd samego `txt` [#17995663][#18003653] Trzeba też ustawić właściwą prędkość transmisji — w końcu okazało się, że dla tego modelu działa 2400 bps, a nie 9600 [#17995748][#18005874][#18005960] Autor po zmianach w obsłudze danych (`handle_data(data)`) i po ustawieniu 2400 potwierdził, że aplikacja zaczęła poprawnie zapisywać odczyty do pliku .txt [#18000824][#18005918][#18005960] Jeśli nadal coś wygląda źle, warto najpierw sprawdzić surowy odczyt w PuTTY lub przez `print(in_hex)`, żeby zobaczyć, jakie bajty faktycznie wychodzą z portu [#17995769][#18006011]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 17995442
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    witam

    w jaki sposób zapisać sczytane dane z portu com do np. pliku .txt
    poniższy kod łączy się z portem COM8 i wyświetla sczytanie numeru z karty czytnika rfid póki co w konsoli, chciałbym aby te dane zapisał mi do pliku .txt



    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Python: Zapis danych z czytnika RFID przez COM8 do pliku .txt
  • REKLAMA
  • #2 17995539
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Zainteresuje soę czymś takim jak open() np. w takiej formie:

    Kod: Python
    Zaloguj się, aby zobaczyć kod
  • #3 17995554
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    -XantiO- napisał:
    Zainteresuje soę czymś takim jak open() np. w takiej formie:

    Kod: Python
    Zaloguj się, aby zobaczyć kod




    dzięki zrobiłem tak:

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    zapis do pliku działa ale są krzaki:

    b'\x00\x80\x00\x00\x00'

    b'x\xfcx<\x0f'

    b'x\xc0'


    które są zapisane w pliku .txt

    poza tym jest jeszcze coś takiego że na końcu pliku przez cały czas jak jest odpalony program w .py (konsola) to tak jakby zaczytuje jakieś puste dane z portu COM i je ciągle zapisuje do pliku:

    b'
    b'
    b'
    ....i tak dalej, bo pętla się ciągle wykonuje jak to ogarnąć aby tylko po przyłożeniu karty do czytnika była komunikacja i odczyt...?
  • #4 17995567
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Zamiast lecieć w pętli wykorzystaj thread'y
    W pierwzym wpisz sobie obsługę RSa a w drugim obsługę pliku. Poczytaj o semaforach i mutexach do tego.
    A te krzaki świadczą raczej o braku kodowania spróbuj takiej sztuczki:
    Kod: Python
    Zaloguj się, aby zobaczyć kod



    I popraw formatowanie :) na start wstaw [syntax=python\] :)

    --------------------------------------
    EDIT
    --------------------------------------
    Chyba się trochę rozpędziłem :)
    Kod: Python
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 17995576
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    -XantiO- napisał:
    Zamiast lecieć w pętli wykorzystaj thread'y
    W pierwzym wpisz sobie obsługę RSa a w drugim obsługę pliku. Poczytaj o semaforach i mutexach do tego.
    A te krzaki świadczą raczej o braku kodowania spróbuj takiej sztuczki:
    Kod: Python
    Zaloguj się, aby zobaczyć kod



    I popraw formatowanie :) na start wstaw [syntax=python\] :)

    --------------------------------------
    EDIT
    --------------------------------------
    Chyba się trochę rozpędziłem :)
    Kod: Python
    Zaloguj się, aby zobaczyć kod




    zrobiłem jak poradziłeś ale mam błąd:

    File "test1.py", line 12
    do_zapisu = bytes(myString, "UTF-8")
    ^
    TabError: inconsistent use of tabs and spaces in indentation


    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Dodano po 5 [minuty]:

    Kod: Python
    Zaloguj się, aby zobaczyć kod



    i takie coś w cmd:

    File "test1.py", line 12
    do_zapisu = bytes(myString + "\n", "UTF-8")
    ^
    TabError: inconsistent use of tabs and spaces in indentation
  • #6 17995597
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Tak, tak. Trochę namieszałem. Zobacz zeedytowany post. Daj mi kilka minut to rozpisze Ci na szybko obsługę tego w wątkach
  • REKLAMA
  • #7 17995606
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    -XantiO- napisał:
    Tak, tak. Trochę namieszałem. Zobacz zeedytowany post. Daj mi kilka minut to rozpisze Ci na szybko obsługę tego w wątkach



    super
    będę bardzo wdzięczny :)
  • #8 17995614
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Kod: Python
    Zaloguj się, aby zobaczyć kod



    Przejrzyj sobie to. Nie sprawdzałem czy działa bo pisałem z głowy :)
  • #9 17995633
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    zrobiłem tak:

    Kod: Python
    Zaloguj się, aby zobaczyć kod
  • #10 17995642
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Zmień:
    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Na coś takiego:
    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Jakieś dziwne rzeczy chyba lecą na porcie. Sprawdzałeś co tam się wyświetla w np. putty?
  • REKLAMA
  • #12 17995650
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    A spróbuj zmienić tak jak teraz w tej poprzedniej wersji bez threadingów
  • #13 17995651
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    w specyfikacji widzę że:

    Dodatkowo należy pamiętać, żenie jest to kod wysyłany w formacie ASCII (cyfry od 0 do 9 i litery od A do F).
  • #14 17995663
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    No i tu się sprawa rozwiązuje trochę. Kodowanie szesnastkowe. Poszukaj sobie informacji o decode() tam powinno chyba być jak konwertować z tego formatu
  • #15 17995664
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    -XantiO- napisał:
    No i tu się sprawa rozwiązuje trochę



    ?

    Dodano po 34 [sekundy]:

    Przyłożenie identyfikatora powoduje wydanie sygnału dźwiękowego oraz zgaszenie diodyzielonej LED i zaświecenie diody czerwonej LED przez około 1s. Jednocześnie jest wysyłanapięciobajtowa ramka danych z kodem odczytanego identyfikatora w formie binarnej big endian.Uwaga: Kod identyfikatora jest wartością 40-bitową, a ramka zbudowana jest z 5 bajtów po 8bitów tego kodu wysyłanego począwszy od najstarszej części. Dodatkowo należy pamiętać, żenie jest to kod wysyłany w formacie ASCII (cyfry od 0 do 9 i litery od A do F). Na specjalnezamówienie istnieje możliwość wykonania innego formatu wysyłanych danych (jak na przykładwcześniej wspomniany format znakowy). Prędkość transmisji szeregowej wynosi 2400bit/s bezkontroli parzystości i jeden bit stopu. Istnieje również możliwość wykonania na specjalnezamówienie innej prędkości w zakresie od 1200bit/s do 921600bit/s
  • #16 17995665
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Będę przy komputerze to bardziej się rozpisze co i jak. Ewidentnie jest tu problem z interpretacją i dekodowaniem danych.
  • #17 17995666
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    super w takim razie czekam na Twoją fachową pomoc, wielkie dzięki jeszcze raz:)
  • #18 17995748
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Podaj mi model tego czytnika abym mógł spojrzeć w dokumentację.
    Z tego co widzę to masz po pierwsze źle ustawione parametry transmisji a dokładniej chodzi mi o prędkość. Standardowa to 2400 chyba, że masz z inną prędkością czytnik zakupiony.
  • #20 17995769
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    To zobacz co putty wypluje na takiej transmisji
  • #21 17995774
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    Python: Zapis danych z czytnika RFID przez COM8 do pliku .txt
  • #22 17995801
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Wygląda na to, że masz wersję na 9600 jednak. Dość dziwne. Czy wiesz co powinno być na karcie?
  • #23 17995810
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    ten czytnik wszędzie ustawiany jest jako: 9600

    takie dane przez aplikację napisaną przez tą firmę są zwracane:

    Python: Zapis danych z czytnika RFID przez COM8 do pliku .txt
  • #24 17995835
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    20 = Space
    00 = NULL
    44 = D
    57 = W
    F2 = ò

    Tak wygląda odczyt z kodowania do ASCII
    Tak więc wydaje mi się, że prędkość transmisji to właśnie 2400.

    Sprawdź sobie odczyt portu w taki sposób:
    Kod: Python
    Zaloguj się, aby zobaczyć kod

    I pokaż co w terminalu python wypluje
  • #25 17996853
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    -XantiO- napisał:
    20 = Space
    00 = NULL
    44 = D
    57 = W
    F2 = ò

    Tak wygląda odczyt z kodowania do ASCII
    Tak więc wydaje mi się, że prędkość transmisji to właśnie 2400.

    Sprawdź sobie odczyt portu w taki sposób:
    Kod: Python
    Zaloguj się, aby zobaczyć kod

    I pokaż co w terminalu python wypluje



    mam wykorzystać ten kod:

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    i do niego dodać:

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Dodano po 3 [godziny] 36 [minuty]:

    Dodano po 3 [minuty]:

    odpowiedź mkeia:
    W przypadku BxDesktop nie ma protokołu po prostu nr karty jest wysyłany w postaci 5 bajtów z prędkością 2400bits/s.
  • #26 18000824
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Przepraszam, że tak długo musiałeś czekać ale mam ostatnio dużo na głowie.
    Kod: Python
    Zaloguj się, aby zobaczyć kod


    To powinno w pewnym stopniu rozwiązać Twoje problemy. Głównie przypatrz się zawartości handle_data(data)
  • #27 18003653
    _jta_
    Specjalista elektronik
    Posty: 49109
    Pomógł: 3212
    Ocena: 4254
    Czy to musi być w Python-ie? Mam wrażenie, że otwieranie portu może go ustawiać w tryb z translacją (zamianą kodowania) znaków i trzeba to jakoś wyłączyć, a z Pythonem prawie nie mam do czynienia, więc nie pamiętam, jak to zrobić. A z tego, co widać w #1, te dane wyglądają na binarne.
  • #28 18005874
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    -XantiO- napisał:
    Przepraszam, że tak długo musiałeś czekać ale mam ostatnio dużo na głowie.
    Kod: Python
    Zaloguj się, aby zobaczyć kod


    To powinno w pewnym stopniu rozwiązać Twoje problemy. Głównie przypatrz się zawartości handle_data(data)



    Wielkie dzięki Stary nie przepraszaj, ja Ci bardzo dziękuje za wsparcie:)

    odpaliłem to i wygląda to tak:

    Kod: Python
    Zaloguj się, aby zobaczyć kod



    Kod: Python
    Zaloguj się, aby zobaczyć kod
  • #29 18005918
    -XantiO-
    Poziom 21  
    Posty: 463
    Pomógł: 44
    Ocena: 41
    Zmień to:
    Kod: Python
    Zaloguj się, aby zobaczyć kod

    na to:
    Kod: Python
    Zaloguj się, aby zobaczyć kod


    I usuń z tej linijki:
    Kod: Python
    Zaloguj się, aby zobaczyć kod

    to:
    Kod: Python
    Zaloguj się, aby zobaczyć kod
  • #30 18005960
    electric00
    Poziom 12  
    Posty: 183
    Pomógł: 2
    Ocena: 4
    -XantiO- napisał:
    Zmień to:
    Kod: Python
    Zaloguj się, aby zobaczyć kod

    na to:
    Kod: Python
    Zaloguj się, aby zobaczyć kod


    I usuń z tej linijki:
    Kod: Python
    Zaloguj się, aby zobaczyć kod

    to:
    Kod: Python
    Zaloguj się, aby zobaczyć kod



    zmieniłem odpaliło aplikację i sczytuję do pliku .txt:

    komunikację ustawiłem na 2400

    Kod: Python
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ Użytkownik poszukiwał sposobu na zapis danych z czytnika RFID podłączonego do portu COM8 do pliku .txt w Pythonie. Początkowo kod wyświetlał odczytane dane w konsoli, jednak użytkownik chciał je zapisywać. Po kilku próbach i sugestiach dotyczących użycia funkcji `open()` oraz wątków, udało się zrealizować zapis danych. Problemy związane z nieprawidłowym kodowaniem danych (krzaki) zostały zidentyfikowane jako wynik niewłaściwego dekodowania. Ostatecznie użytkownik zmienił parametry transmisji na 2400 bps, co poprawiło komunikację z czytnikiem. W końcu, po wielu próbach, użytkownik zdecydował się na zakup innego czytnika, który działał bez problemów z kodowaniem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA