Prawdziwe 9-bitowe dane portu szeregowego?

10

Mam istniejący, w połowie kompletny projekt automatu działającego na Atmel UTC, który chcę przenieść do Pi.

Aby rozmawiać z urządzeniami peryferyjnymi, takimi jak akceptor monet, musi obsługiwać magistralę Multi-Drop Bus z 9-bitowym interfejsem portu szeregowego (plus bity start, stop i parzystość).

Nauczyłem się na własnej skórze z płytką Atmel, która hakuje znalezione w sieci sugestie, które polegają na użyciu bitu parzystości, ponieważ 9-ty bit danych może powodować złe problemy z synchronizacją - trudne do wykrycia i poprawienia (więc nie rób skieruj mnie do tego lub podobnego. Dzięki).

Czy ktoś wie, czy / gdzie mogę kupić prawdziwy 9-bitowy port szeregowy dla Pi (punkty bonusowe, jeśli może on jakoś pracować z Pi zero).

Czy jest dostępny kapelusz? Czy mógłbym łatwo (mam jako / w faceta, z niewielką wiedzą na temat cz / w) użyć innej płyty do obsługi 9 bitów danych UART i kontrolować to z Pi?

Mawg mówi, że przywróć Monikę
źródło
1
Interfejs szeregowy w GPIO - na obrazach Raspbian itp. Został ustawiony tak, aby zapewniał wyjście z Pi, więc musisz najpierw to wyłączyć, ale nadal będziesz mieć problem z bitami, które nie są w standardowym zakresie. Ten post na forach może również pomóc.
Wilf
1
Czy możesz dodać sprzęt do projektu? Tarcza z UART nie byłaby zbyt trudna do wykonania i dałaby ci dokładnie to, czego potrzebujesz, choć mogłaby zużyć więcej I / O niż jest to warte. Naprawdę niskiej jakości procesor PIC można prawdopodobnie szybko zaprogramować do tłumaczenia między 8 a 9 bitami szeregowymi, nie kosztując zbyt wiele ani nie stanowiąc dla ciebie nadmiernej pracy.
Michael Kohne
Czy wiesz gdzie mógłbym kupić?
Mawg mówi o przywróceniu Moniki

Odpowiedzi:

7

Moja biblioteka pigpio obsługuje odczytywanie i zapisywanie 9-bitowych danych szeregowych. Wykorzystuje bit banging, dzięki czemu można użyć dowolnego dostępnego GPIO.

Jeśli dobrze pamiętam, prędkości 19,2 kb / s lub wolniejsze były dość stabilne.

Jakich bitów na sekundę potrzebujesz?

Czytanie ( C , Python ) jest nieco łatwiejsze niż pisanie ( C , Python ).

joan
źródło
1
Czy jesteś 100 * pewien? Kiedy zacząłem się rozwijać, ostrzegano mnie przed takimi „hackami” i mówiłem, że pojawią się problemy z synchronizacją. Czy wiesz, czy ktoś próbował tego na automacie? en.wikipedia.org/wiki/Multidrop_bus and coin-acceptor.com.cn/Upload/EditorFiles/technicalfile/… (przepraszam, nie mogę podać numeru sekwencyjnego, ponieważ jestem za zaporą firmową)
Mawg mówi, że przywraca Monikę
3
Jedyne doświadczenie, jakie mam, to korzystanie z biblioteki między Pi a laptopem z szeregowym kluczem USB. Testy, które wykonałem, są udokumentowane w raspberrypi.stackexchange.com/questions/27488/… . Moje oprogramowanie używa tylko RX / TX i uziemienia, więc jeśli zrobisz coś wymyślnego z innymi sygnałami szeregowymi, możesz mieć problemy.
joan
Brzmi dobrze. : Pozwól, że sprawdzę specyfikację i skontaktuję się z Tobą
Mawg mówi o przywróceniu Moniki
2
@Mawg: zaakceptowałeś to. Czy to oznacza, że ​​proponowane rozwiązanie działało niezawodnie?
Thomas Weller,
3

Przydzielono mi projekt uruchomienia automatu z przekąskami, który korzysta z protokołu MDB do płatności, i ukończyłem projekt przy użyciu Pi Zero (Orange).

Wypróbowałem 9-bitowe sprzętowe biblioteki szeregowe i programowe i miałem problemy z synchronizacją na Pi Zero. 9-bitowa komunikacja MDB stała się uciążliwa. Protokół MDB mówi, że urządzenia peryferyjne powinny mieć tolerancję% 5 dla szeregowego taktowania komunikacji, jednak różni dostawcy urządzeń peryferyjnych mają różne tolerancje, niezgodne z protokołem MDB. Gdy myślisz, że udało Ci się nawiązać komunikację szeregową, ale wypróbowałeś peryferyjne urządzenie płatnicze innego dostawcy, to po prostu nie działa. Więc nie polegaj na arkuszu danych protokołu MDB. Mam już dość wdrażania kontrolera MDB dla błędnych dostawców. Również niektóre urządzenia peryferyjne mogą pobierać nadmierne ilości prądu z pinów Uart podczas wewnętrznego procesu rozruchu i mogą uszkodzić szeregową warstwę komunikacyjną. Więc lepiej użyj abstrakcji. Transoptory są w porządku, ale nadal nie chciałbym Zalecam obsługę komunikacji szeregowej MDB za pomocą Pi Zero. Lepszym sposobem jest zastosowanie metody warstwy środkowej przy użyciu AVR.

Zamiast używać Uart na Pi Zero do komunikacji MDB, użyłem Atmega328 AVR do obsługi MDB, odpytywania itp. Atmega328 kontroluje urządzenia peryferyjne MDB za pomocą biblioteki Software Serial i wysyła czytelne dane ludzkie do Pi Zero na sprzęcie szeregowym. Cały schemat elektroniki, źródła i obraz Pi Zero Armbian, kod Pythona do operacji vendingowych są dostępne tutaj:

http://eliverse.com/content/vendiverse/

Możesz sprawdzić stronę wiki, aby uzyskać szczegółowe informacje na temat sterowania silnikami, czujnikami dostawy produktów, chłodnicami i wyświetlaczami LCD. Jest to kompletny projekt kontrolera automatu i jest używany przez kilku producentów automatów.

Eliverse
źródło
To fantastyczna odpowiedź, zwłaszcza, że ​​jest to pierwsza odpowiedź. Wcześniej miałem sukces z płytą Atmel z prawdziwym 9-bitowym UART i miałem nadzieję zaoszczędzić pieniądze, używając Raspberry Pi, ale twoje rozwiązanie jest tak kompleksowe, że głupio byłoby z niego nie korzystać. Niestety jestem facetem tylko programistycznym, więc w przypadku prototypu zdecydowanie wolałbym rozwiązanie nie wymagające lutowania. Czy możesz polecić tablicę COTS?
Mawg mówi o przywróceniu Moniki
Na tej stronie witryny znajduje się komunikat „Jeśli wykonałeś kroki w tworzeniu płyty VMC Vendiverse lub jeśli uzyskałeś płytę VMC Vendiverse”. Czy mogę kupić jeden od ciebie? Ile by to kosztowało? Ponadto, jeśli polecasz jakieś urządzenia peryferyjne MDB, czy możesz dodać to do swojej witryny? Dzięki
Mawg mówi o przywróceniu Moniki
Wygląda na to, że moje e-maile utknęły w twoim spamie. Czy możesz się ze mną skontaktować? Masz mój adres e-mail, a ja wciąż jestem w Bremie
Mawg mówi o przywróceniu Moniki
Teraz wygląda na to, że strona jest martwa, a projekt porzucony :-(
Mawg mówi o przywróceniu Moniki
1

Wszystkie dane szeregowe są z definicji 1 bitowe. Interfejsy odczytują i zapisują te dane, jak uzgodnić, w jaki sposób interpretują bity do i od znaczących danych.
Jeśli chcesz 9 bitów danych i bit parzystości oraz stop i bit startu. Następnie to do Ciebie należy konwersja danych do tego formatu i interpretacja danych, które czytasz w tym formacie. Moduł pigpio wspomniany w innej odpowiedzi da ci interfejs sprzętowy, którego potrzebujesz, lub możesz napisać własny. Jeśli rozwijasz się w Pythonie, sugeruję przyjrzeć się modułowi bitString.py autorstwa Scotta Griffithsa jako bibliotekę, która dość łatwo manipuluje danymi opartymi na bitach.

Paul Smith
źródło
5
Problem z przesyłaniem danych szeregowych polega na synchronizacji. Dane nie są taktowane, a jedynym gwarantowanym przejściem poziomu są bity stop / start. Oba końce muszą utrzymywać ścisłe, niezakłócone wyczucie czasu, aby ustalić, gdzie są bity. Właśnie dlatego do przesyłania i odbierania danych zwykle wykorzystywany jest dedykowany sprzęt. Istnieje niewielka swoboda pomiaru czasu.
Joan
1

Zdecydowanie wolę sprzętowy UART niż implementację oprogramowania, tak jak robi to Pigpio.

Możesz użyć bitu parzystości do komunikacji 9-bitowej. Jest jeden mały problem: bieżące jądro nie obsługuje CMSPAR (parzystość spacja / znak).
Ale możesz zmienić parzystość / parzystość nieparzystą, aby uzyskać pożądaną 9-bitową wartość, nawet z bieżącym jądrem, na przykład:

unsigned char check_parity(unsigned char v)
{
    v ^= v >> 4;
    v &= 0xf;
    return (0x6996 >> ((v ^ (v >> 4)) & 0xf)) & 1;
}

/* send 9 bits - 8 bits of byte + 1 bit of parity */
send_byte_with_parity(unsigned char byte, unsigned char parity)
{
    if (check_parity(byte) == parity) {
        options.c_cflag &= ~PARODD;
    } else {
        options.c_cflag |= PARODD;
    }
    tcsetattr(fd, 0, &options);
    write(fd, &byte, 1);
}


Lepsze podejście IMHO używa małej poprawki jądra do obsługi CMSPAR:
http://marc.info/?l=linux-serial&m=145706834101241&w=2
Dodaje obsługę parzystości znak / przestrzeń, co pozwala na nieco prostszy kod.

PS Z tym podejściem wdrożyłem MDB w wersji szeregowej. Działa na Pi bezbłędnie.
Poprawka PPS została zatwierdzona, a CMSPAR będzie działać od samego początku, począwszy od jądra 4.6.

edo1
źródło
Bez łatki lub przynajmniej linku i pełniejszych szczegółów nie jest to odpowiedź, ani nawet pomocny komentarz - poza tym, że teoretycznie jest to możliwe.
Steve Robillard
Nadal pozostawia więcej pytań niż odpowiedzi: jak zaimplementować MDB, jak zastosować łatkę do jądra, czy będzie działać na wszystkich Pi, czy tylko na niektórych? Co jeszcze może się zepsuć? Jak mogę to cofnąć w razie potrzeby? Czy ta łatka jest bezpieczna? Pamiętaj, że wiesz o tym, ponieważ wdrożyłeś go, ale OP nie.
Steve Robillard
1
Nie cofnąłem twojej odpowiedzi, ponieważ przyznajesz, że Twoja odpowiedź może być lepsza. Mam nadzieję, że skorzystasz z okazji, aby to poprawić.
Steve Robillard,
Co jeszcze muszę dodać? Wdrożenie MDB? Od pracodawcy nie otrzymałem pozwolenia na open source.
edo1
Zobacz mój poprzedni komentarz i pamiętaj, że użytkownik końcowy nie wie wszystkiego, co robisz.
Steve Robillard,
1

Nie można NIEZAWODNIE podłączyć szeregowego RPi bezpośrednio do magistrali MDB ze względu na format 9-bitowy i ścisłe taktowanie MDB. Wiadomości między urządzeniami peryferyjnymi MDB i RPi należy konwertować w locie i w czasie rzeczywistym. Sprawdź ten link, pomoże: DIY konwerter MDB-UART

ivan ivanov
źródło