Benar data port serial 9-bit?

10

Saya memiliki proyek mesin penjual otomatis setengah jalan yang berjalan di Atmel UTC, yang ingin saya port ke Pi.

Untuk dapat berbicara dengan periferal, seperti akseptor koin, ia harus mendukung Multi-Drop Bus yang memiliki antarmuka port serial 9-data bit (plus bit start, stop, dan bit paritas).

Saya belajar dengan cara yang sulit dengan papan Atmel bahwa peretasan yang ditemukan disarankan di internet, yang mengandalkan penggunaan bit paritas karena bit data ke-9 dapat menyebabkan masalah waktu yang buruk - sulit untuk dideteksi dan diperbaiki (jadi, tolong jangan rujuk saya ke ini , atau serupa. Terima kasih).

Apakah ada yang tahu jika / di mana saya dapat membeli port serial 9 bit yang benar untuk Pi (poin bonus jika entah bagaimana dapat bekerja dengan nol Pi).

Apakah mungkin ada Topi? Atau bisakah saya dengan mudah (saya memiliki sebagai / w guy, dengan sedikit pengetahuan tentang h / w) menggunakan papan lain untuk menangani bit data 9 UART dan mengendalikannya dari Pi?

Mawg berkata mengembalikan Monica
sumber
1
Ada antarmuka serial pada GPIO - pada Raspbian dll gambar telah diatur untuk memberikan output dari Pi sehingga Anda harus menonaktifkannya terlebih dahulu, tetapi Anda masih akan memiliki masalah dengan bit tidak dalam kisaran standar. Posting ini di forum dapat membantu juga.
Wilf
1
Bisakah Anda menambahkan perangkat keras ke proyek? Perisai dengan UART tidak akan terlalu sulit untuk dibuat, dan akan memberi Anda apa yang Anda butuhkan, meskipun mungkin menghabiskan lebih banyak I / O daripada nilainya. CPU PIC yang sangat rendah mungkin dapat dengan cepat diprogram untuk menerjemahkan antara seri 8 dan 9 bit tanpa biaya terlalu banyak atau menjadi terlalu banyak pekerjaan untuk Anda.
Michael Kohne
Apakah Anda tahu di mana saya bisa membelinya?
Mawg mengatakan mengembalikan Monica

Jawaban:

7

Perpustakaan Pigpio saya mendukung membaca dan menulis data serial 9-bit. Ini menggunakan bit banging sehingga Anda dapat menggunakan GPIO yang tersedia.

Jika saya ingat benar setiap kecepatan 19,2 kbps atau lebih lambat cukup stabil.

Bit per detik apa yang Anda butuhkan?

Membaca ( C , Python ) sedikit lebih mudah daripada menulis ( C , Python ).

joan
sumber
1
Apakah Anda 100 * yakin? Ketika saya pertama kali mulai berkembang, saya diperingatkan tentang "peretasan" semacam itu dan diberi tahu bahwa akan ada masalah waktu. Apakah Anda tahu ada yang mencobanya dengan mesin penjual otomatis? en.wikipedia.org/wiki/Multidrop_bus dan coin-acceptor.com.cn/Upload/EditorFiles/technicalfile/… (maaf, saya tidak dapat memberikan nomor sectoin karena saya berada di belakang firewall perusahaan)
Mawg mengatakan mengembalikan Monica
3
Satu-satunya pengalaman yang saya miliki adalah menggunakan perpustakaan antara Pi dan laptop dengan dongle serial USB. Tes yang saya lakukan didokumentasikan dalam raspberrypi.stackexchange.com/questions/27488/… . Perangkat lunak saya hanya menggunakan RX / TX dan ground jadi jika Anda melakukan sesuatu yang mewah dengan sinyal serial lain Anda mungkin memiliki masalah.
joan
Kedengarannya bagus. : Biarkan saya memeriksa spesifikasi & kembali kepada Anda
Mawg mengatakan mengembalikan Monica
2
@ Mawg: Anda telah menerima ini. Apakah itu berarti bahwa solusi yang diusulkan bekerja dengan andal?
Thomas Weller
3

Saya ditugaskan proyek untuk menjalankan mesin penjual makanan ringan yang menggunakan protokol MDB untuk pembayaran dan saya telah menyelesaikan proyek menggunakan Pi Zero (Orange).

Saya telah mencoba 9 bit hardware serial dan software serial library dan mengalami masalah waktu pada Pi Zero. Komunikasi serial 9bit MDB menjadi menyebalkan. Protokol MDB mengatakan periferal harus memiliki toleransi% 5 untuk waktu komunikasi serial namun vendor periferal yang berbeda memiliki toleransi yang berbeda, tidak sesuai dengan protokol MDB. Ketika Anda berpikir bahwa Anda telah menyelesaikan komunikasi serial tetapi mencoba perangkat pembayaran vendor yang berbeda, itu tidak berfungsi. Jadi jangan mengandalkan lembar data protokol MDB. Saya muak dan lelah menerapkan pengontrol MDB untuk vendor kereta. Juga beberapa periferal dapat mengalirkan amont arus berlebih dari pin uart selama proses boot internal dan dapat merusak lapisan komunikasi serial Anda. Jadi, Anda lebih baik menggunakan abstraksi. Optocoupler baik-baik saja tetapi saya tetap tidak akan t merekomendasikan penanganan komunikasi serial MDB menggunakan Pi Zero. Cara yang lebih baik adalah dengan menggunakan pendekatan lapisan tengah menggunakan AVR.

Alih-alih menggunakan Uart pada Pi Zero untuk komunikasi MDB, saya menggunakan Atmega328 AVR untuk penanganan, pemungutan suara dll. Atmega328 mengontrol perangkat MDB menggunakan perpustakaan Serial Perangkat Lunak dan mengirimkan data yang dapat dibaca manusia ke Pi Zero pada serial perangkat keras. Semua skema elektronik, sumber, dan gambar Pi Zero Armbian, kode Python untuk operasi Vending tersedia di sini:

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

Anda dapat memeriksa halaman wiki untuk perincian lebih lanjut tentang mengendalikan motor, sensor pengiriman produk, pendingin dan tampilan LCD karakter. Ini adalah proyek pengontrol mesin penjual otomatis yang lengkap dan sedang digunakan oleh beberapa produsen mesin penjual otomatis.

Eliverse
sumber
Ini adalah jawaban yang fantastis, terutama karena ini adalah jawaban pertama. Saya sebelumnya telah sukses dengan papan Atmel dengan UART 9-bit sejati dan berharap dapat menghemat uang dengan menggunakan Raspberry Pi, tetapi solusi Anda sangat komprehensif sehingga saya bodoh jika tidak menggunakannya. Sayangnya, saya hanya seorang pria perangkat lunak, jadi untuk prototipe saya akan lebih suka solusi yang diperlukan tanpa solder. Bisakah Anda merekomendasikan papan COTS?
Mawg mengatakan mengembalikan Monica
Halaman situs web Anda ini mengatakan "Jika Anda telah menyelesaikan langkah-langkah dalam Membuat Papan VMC Vendiverse atau jika Anda telah mendapatkan papan Vendiverse VMC". Bisakah saya membeli satu dari Anda? Berapa harganya? Juga, jika Anda merekomendasikan perangkat MDB tertentu, dapatkah Anda menambahkannya ke situs Anda? Terima kasih
Mawg mengatakan mengembalikan Monica
Sepertinya email saya macet di spam Anda. Bisakah Anda menghubungi saya? Anda memiliki alamat email saya, dan saya masih di Bremen
Mawg mengatakan mengembalikan Monica
Sekarang sepertinya halaman itu mati, dan proyek itu ditinggalkan :-(
Mawg mengatakan mengembalikan Monica
1

Semua data serial menurut definisi, 1 bit. Terserah antarmuka membaca dan menulis data bagaimana menyepakati bagaimana mereka menafsirkan bit ke dan dari data yang bermakna.
Jika Anda ingin 9 bit data, dan bit paritas, dan berhenti dan bit mulai. Maka terserah kepada Anda untuk mengubah data Anda ke dalam format itu, dan untuk menafsirkan data yang Anda baca dalam format itu. Modul pigpio yang disebutkan dalam jawaban lain akan memberi Anda antarmuka perangkat keras yang Anda butuhkan, atau Anda dapat menulis sendiri. Jika Anda mengembangkan python, saya sarankan untuk melihat modul bitString.py oleh Scott Griffiths sebagai pustaka yang membuatnya cukup mudah untuk memanipulasi data berbasis bit.

Paul Smith
sumber
5
Masalah dengan pengiriman data serial ada pada waktu. Data tersebut bukan self clocking dan satu-satunya transisi level yang dijamin adalah bit stop / start. Kedua ujungnya harus mempertahankan waktu yang ketat dan tidak terputus untuk bekerja di mana bit berada. Itulah sebabnya perangkat keras khusus umumnya digunakan untuk mengirim dan menerima data. Ada sedikit waktu luang.
joan
1

Saya pasti lebih suka perangkat keras UART daripada implementasi perangkat lunak seperti pigpio.

Anda dapat menggunakan bit paritas untuk komunikasi 9-bit. Ada satu masalah kecil: kernel saat ini tidak memiliki dukungan CMSPAR (spasi / paritas tanda).
Tetapi Anda dapat mengganti genap / ganjil untuk mendapatkan nilai bit ke-9 yang diinginkan bahkan dengan kernel saat ini, contoh:

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);
}


Pendekatan yang lebih baik IMHO adalah dengan menggunakan patch kernel kecil untuk dukungan CMSPAR:
http://marc.info/?l=linux-serial&m=145706834101241&w=2
Ia menambahkan dukungan parity tanda / ruang, yang memungkinkan kode menjadi sedikit lebih sederhana.

PS Saya mengimplementasikan MDB melalui serial dengan pendekatan ini. Ini bekerja pada Pi dengan sempurna.
Patch PPS telah disetujui dan CMSPAR akan bekerja di luar kotak dimulai dengan kernel 4.6.

edo1
sumber
Tanpa tambalan atau setidaknya tautan, dan perincian yang lebih lengkap ini bukan jawaban, juga bukan komentar yang membantu - selain dari yang dikatakan secara teori dimungkinkan.
Steve Robillard
Masih ada lebih banyak pertanyaan daripada jawaban: Bagaimana cara menerapkan MDB, bagaimana cara menerapkan patch kernel, apakah ini akan bekerja pada semua Pi atau hanya beberapa di antaranya? Apa lagi yang bisa merusak ini? Bagaimana saya bisa membatalkan ini jika diperlukan? Apakah tambalan ini aman? Ingat Anda tahu ini karena Anda menerapkannya OP belum.
Steve Robillard
1
Saya telah membatalkan penghapusan jawaban Anda, karena Anda mengakui jawaban Anda bisa lebih baik. Saya harap Anda akan mengambil kesempatan untuk memperbaikinya.
Steve Robillard
Apa lagi yang perlu saya tambahkan? Implementasi MDB? Saya tidak mendapatkan izin untuk membuka-sumber dari atasan saya.
edo1
Lihat komentar saya sebelumnya dan ingat bahwa pengguna akhir tidak tahu semua yang Anda lakukan.
Steve Robillard
1

Anda tidak dapat DIANDALKAN menghubungkan serial RPi langsung ke bus MDB karena format 9-bit dan timing MDB yang ketat. Pesan antara perangkat MDB dan RPi perlu dikonversi saat itu juga dan dalam waktu nyata. Periksa tautan ini, ini akan membantu: Konverter MDB-UART DIY

ivan ivanov
sumber